Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete positional parameters in Bash?

You can skip positional parameters with shift but can you delete positional parameters by passing the position?

x(){ CODE; echo "$@"; }; x 1 2 3 4 5 6 7 8
> 1 2 4 5 6 7 8

I would like to add CODE to x() to delete positional parameter 3. I don't want to do echo "${@:1:2} ${@:4:8}". After running CODE, $@ should only contain "1 2 4 5 6 7 8".

like image 810
Shelley Avatar asked Jul 06 '11 10:07

Shelley


People also ask

What does [- Z $1 mean in bash?

$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script. Follow this answer to receive notifications.

What is positional parameters in bash?

bash scripts uses positional parameters to process command line arguments in a bash shell script, to get process status, exit status and options flag.as an arguments to process the inputs. Learn to identify, and use these parameters to add more logic and functionality in your bash scripts.

What is $@ in bash?

bash [filename] runs the commands saved in a file. $@ refers to all of a shell script's command-line arguments. $1 , $2 , etc., refer to the first command-line argument, the second command-line argument, etc. Place variables in quotes if the values might have spaces in them.

What does unset do in bash?

Use unset command to delete the variables during program execution. It can remove both functions and shell variables.


3 Answers

The best way, if you want to be able to pass on the parameters to another process, or handle space separated parameters, is to re-set the parameters:

$ x(){ echo "Parameter count before: $#"; set -- "${@:1:2}" "${@:4:8}"; echo "$@"; echo "Parameter count after: $#"; }
$ x 1 2 3 4 5 6 7 8
Parameter count before: 8
1 2 4 5 6 7 8
Parameter count after: 7

To test that it works with non-trivial parameters:

$ x $'a\n1' $'b\b2' 'c 3' 'd 4' 'e 5' 'f 6' 'g 7' $'h\t8'
Parameter count before: 8
a
1 2 d 4 e 5 f 6 g 7 h   8
Parameter count after: 7

(Yes, $'\b' is a backspace)

like image 88
l0b0 Avatar answered Oct 04 '22 20:10

l0b0


x(){
    #CODE
    params=( $* )
    unset params[2]
    set -- "${params[@]}"

    echo "$@"
}

Input: x 1 2 3 4 5 6 7 8

Output: 1 2 4 5 6 7 8

like image 40
Prince Bhanwra Avatar answered Oct 04 '22 20:10

Prince Bhanwra


From tldp

# The "unset" command deletes elements of an array, or entire array.
unset colors[1]              # Remove 2nd element of array.
                             # Same effect as   colors[1]=
echo  ${colors[@]}           # List array again, missing 2nd element.

unset colors                 # Delete entire array.
                             #  unset colors[*] and
                             #+ unset colors[@] also work.
echo; echo -n "Colors gone."               
echo ${colors[@]}            # List array again, now empty.
like image 25
Fredrik Pihl Avatar answered Oct 04 '22 18:10

Fredrik Pihl