14

bash では、空白を含む引数をエスケープできます。

foo "a string"

これは、コマンドまたは関数への引数にも機能します。

bar() {
    foo "$@"
}

bar "a string"

ここまでは順調ですが、 を呼び出す前に引数を操作したい場合はどうすればよいfooでしょうか?

これは動作しません:

bar() {
    for arg in "$@"
    do
        args="$args \"prefix $arg\""
    done

    # Everything looks good ...
    echo $args

    # ... but it isn't.
    foo $args

    # foo "$args" would just be silly
}

bar a b c

では、引数に空白が含まれている場合、どのように引数リストを作成するのでしょうか?

4

5 に答える 5

23

これを行うには (少なくとも) 2 つの方法があります。

  1. 配列を使用し、次を使用して展開し"${array[@]}"ます。

    bar() {
        local i=0 args=()
        for arg in "$@"
        do
            args[$i]="prefix $arg"
            ((++i))
        done
    
        foo "${args[@]}"
    }
    

    それで、私たちは何を学びましたか?"${array[@]}"は には に${array[*]}です."$@"$*

  2. または、配列を使用したくない場合は、次を使用する必要がありますeval

    bar() {
        local args=()
        for arg in "$@"
        do
            args="$args \"prefix $arg\""
        done
    
        eval foo $args
    }
    
于 2009-01-05T00:38:46.760 に答える
6

数値インデックスを使用する必要のない短いバージョンを次に示します。

(例:findコマンドへの引数の作成)

dir=$1
shift
for f in "$@" ; do
    args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
于 2013-10-03T19:44:47.990 に答える
1

配列(Bashの隠された機能の1つ)を使用します。

于 2009-01-04T19:51:34.013 に答える
0

細部を少し変更して、提案どおりに配列を使用できます。fooを呼び出す行は次のようになります

 foo "${args[@]}"
于 2009-01-06T14:42:52.793 に答える
0

私もこれに問題がありました。Windowsコンピューター(cygwin)の重要なファイルをバックアップするためのbashスクリプトを作成していました。私も配列アプローチを試しましたが、まだいくつかの問題がありました。どのように修正したか正確にはわかりませんが、役に立つ場合に備えて、コードの重要な部分を以下に示します。

WORK="d:\Work Documents\*"
#   prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
    echo "Add $x to archive? (y/n)"
    read DO
    if [ "$DO" == "y" ]; then
        echo "compressing $x"
        7zip a $W_OUTPUT "$x"
    fi
    echo ""
done
于 2009-01-06T14:52:26.800 に答える