0

Bashスクリプトでコマンドライン引数を実行すると、ループ変数の値に「アクセス」できないようです。のようなものを書けるようになりたい

#!/bin/bash
for myvar in 1 2 3
do
  $@
done

スクリプトをとして実行します./myscript echo "${myvar}"

これを行うと、行は空としてエコーされます。何がどこで評価されているのかを正確に把握していないのではないでしょうか。

私が欲しいものは可能ですか?

4

1 に答える 1

6

$myvar子スクリプトが実行される前に評価されるため、内部で評価することはできません。

つまり、スクリプトを次のように呼び出す場合です。

./myscript echo "${myvar}"

実際に呼び出されているのは次のとおりです。

./myscript echo ''

$myvarそれが囲んでいる環境では空であると仮定します。


悪になりたい場合 (これ悪であり、バグを作成するため、実行しないでください)、eval を使用できます。

#!/bin/bash
for myvar in 1 2 3; do
  eval "$1"
done

...そして次のように呼び出します:

./myscript 'echo "${myvar}"'

それほどひどいことは、変数をエクスポートすることです:

#!/bin/bash
export myvar
for myvar in 1 2 3; do
  "$@"
done

...しかし、その場合でも、スクリプトを呼び出す方法は事前評価を避ける必要があります。たとえば、これは上記と組み合わせて機能します。

./myscript bash -c 'echo "$myvar"'

...しかし、基本的には eval に戻ります。一方で:

./myscript ./otherscript

...は、それが内部のどこかをotherscript参照していると仮定して、あなたが望むことをします。$myvar(これは、シェル スクリプトやスクリプトである必要はありません。実行可能ファイルまたはその他のコマンドにすることができmyvar、環境内で見つけることができます)。


あなたが達成しようとしている本当の目標(つまり、ビジネス上の目的)は何ですか?おそらく、ベスト プラクティスに合わせてより適切に達成する方法があるでしょう。

于 2012-08-02T16:13:10.440 に答える