Remove last argument from argument list of shell script (bash)

argument-passing, automator, bash, shell

Solution

Assuming that you already have an `array`, you can say:

unset "array[${#array[@]}-1]"

For example, if your script contains:

array=( "$@" )
unset "array[${#array[@]}-1]"    # Removes last element -- also see: help unset
for i in "${array[@]}"; do
  echo "$i"
done

invoking it with: `bash scriptname foo bar baz` produces:

foo
bar

Problem

This question concerns a bash script that is run in automator osx. I am using automator actions to get and filter a bunch of file references from the finder. Then I append to that list the name of the parent folder, also via an automator action. Automator then feeds these arguments to an action called "run shell script". I am not sure exactly how automator invokes the script but the argument list looks like this when echoed with: `echo "$@"` /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/01/01000 43-001.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/02/02000 43-002.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/03/03000 43-003.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50 In this case path to 3 files and a folder. In the shell script I launch an application called ripcheckc* with the args passed from automator minus the last argument(the folder) in the list. I use this to remove the last argument: ``` _args=( "$@" ) unset _args[${#_args[@]}-1] ``` And this is `echo $_args`: /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/01/01000 43-001.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/02/02000 43-002.wav /Volumes/G-Raid/Online/WAV_TEST/Testbok 50/03/03000 43-003.wav Same as before but without the folder. Now, if I run ripcheckc with `"$@"` as argument it works (but fails later on because of that last path in the argument list) If I use `${_args[@]}` the application will just abort silently. When I echo `$@` and `_args` the output looks identical except for the last argument. My question is - what is the difference between $@ and $_args that make the first valid input and the second not? *The application is ripcheckc I hope my question makes sense. EDIT: Solved.

Original source