Pass multi-word arguments to a bash function
function params(){ arg=("$@") for ((i=1;i<=$1;i++)) ;do echo "${arg[i]}" done echo . for ((;i<=$#-$1+2;i++)) ;do echo "${arg[i]}" done}items=(w x 'z t')params $# "$@" "${items[@]}"
Assuming you call your script with args a b 'c d'
, the output is:
abc d.xyz t
Peter.O's answer above works fine, and this is an addendum to it, with an example.
I needed a function or script that would take multi-word arguments, that would then be used to search the list of running processes and kill those that matched one of the arguments. The following script does that. The function kill_processes_that_match_arguments
only needs one for
loop, because my need was only to iterate over the set of all arguments to the function. Tested to work.
#!/bin/bashfunction kill_processes_that_match_arguments(){ arg=("$@") unset PIDS_TO_BE_KILLED for ((i=0;i<$#;i++)) do unset MORE_PIDS_TO_KILL MORE_PIDS_TO_KILL=$( ps gaux | grep "${arg[i]}" | grep -v 'grep' | awk '{ print $2 }' ) if [[ $MORE_PIDS_TO_KILL ]]; then PIDS_TO_BE_KILLED="$MORE_PIDS_TO_KILL $PIDS_TO_BE_KILLED" fi done if [[ $PIDS_TO_BE_KILLED ]]; then kill -SIGKILL $PIDS_TO_BE_KILLED echo 'Killed processes:' $PIDS_TO_BE_KILLED else echo 'No processes were killed.' fi}KILL_THESE_PROCESSES=('a.single.word.argument' 'a multi-word argument' '/some/other/argument' 'yet another')kill_processes_that_match_arguments "${KILL_THESE_PROCESSES[@]}"