16

bash スクリプト関数内では、スクリプトのコマンド ライン引数と、別の引数リストを操作する必要があります。だから私は2つの引数リストを関数に渡そうとしています.問題は、複数の単語の引数が分割されることです.

function params()
{
    for PARAM in $1; do
        echo "$PARAM"
    done

    echo .

    for ITEM in $2; do
        echo "$ITEM"
    done
}

PARAMS="$@"
ITEMS="x y 'z t'"
params "$PARAMS" "$ITEMS"

スクリプトを呼び出すと、

myscript.sh a b 'c d'
a
b
c
d
.
x
y
'z
t'

2 つのリストがあるため、全体として関数に渡す必要があります。問題は、単一引用符 'c d' と 'z t' で囲まれた複数単語の項目を尊重しながら、要素を反復処理する方法です。

私が持っている回避策 (以下を参照) では BASH_ARGV を使用するため、関数に単一のリストを渡すだけで済みます。ただし、何が起こっているのか、上記を機能させるために何が必要なのかをよりよく理解したいと思います。

function params()
{
    for PARAM in "${BASH_ARGV[@]}"; do
        echo "$PARAM"
    done

    echo .

    for ITEM in "$@"; do
        echo "$ITEM"
    done
}

params x y 'z t'

スクリプトを呼び出すと、

myscript.sh a b 'c d'
c d
b
a
.
x
y
z t

...これが必要な方法です(最初のリストが逆になっていることを除いて、それは許容できると思います)

4

2 に答える 2

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

スクリプトを argsa b 'c d'で呼び出すと仮定すると、出力は次のようになります。

a
b
c d
.
x
y
z t
于 2012-04-08T12:25:40.677 に答える
3

上記のPeter.Oの回答は正常に機能します。これは、例を含む補遺です。

複数語の引数を取り、実行中のプロセスのリストを検索し、引数の 1 つに一致するプロセスを強制終了するために使用される関数またはスクリプトが必要でした。次のスクリプトはそれを行います。関数にkill_processes_that_match_arguments必要なforループは 1 つだけです。これは、関数へのすべての引数のセットを反復処理することだけが必要だったからです。動作確認済み。

#!/bin/bash

function 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[@]}"
于 2012-11-01T10:42:50.880 に答える