7

変数に一連の引数を作成し、それをスクリプトに渡そうとしましたが、予想とは異なる動作になりました。

test.sh

#!/bin/bash

for var in "$@"; do
  echo "$var"
done

入力

usr@host$ ARGS="-a \"arg one\" -b \"arg two\""
usr@host$ ./test.sh $ARGS

出力

-a
"arg
one"
-b
"arg
two"

期待される

-a
arg one
-b
arg two

引用符で囲まれた引数をスクリプトに直接渡すと、機能することに注意してください。eval を使用してこれを回避することもできますが、最初のアプローチが失敗した理由を理解したいと思いました。

回避策

ARGS="./test.sh -a "arg one" -b "arg two""
eval $ARGS
4

1 に答える 1

16

ある意味で第 2 レベルの引用を提供する配列を使用する必要があります。

ARGS=(-a "arg one" -b "arg two")
./test.sh "${ARGS[@]}"

配列の展開では、配列の要素ごとに 1 つの単語が生成されるため、配列の作成時に引用した空白は、 に渡される引数のリストを作成するときに単語の区切りとして扱われませんtest.sh

配列は POSIX シェルではサポートされていないことに注意してください。ただし、これは配列が修正のために導入された POSIX シェルの正確な欠点です。

于 2013-09-25T19:56:42.723 に答える