Pass multi-word arguments to a bash function Pass multi-word arguments to a bash function bash bash

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[@]}"