値に変数を含む環境変数をエクスポートしたいが、エクスポート中に変数(値内にある)を評価したくありません。つまり
export STY=for i in {0..3}; do echo $i; done
したがって、私の要件は、STYをエコーするときに必要な出力が次のようになるはずです。
echo $STY
for i in {0..3}; do echo $i; done
ただし、$i はエクスポート中に評価されます。私はそのままにする必要があります。
答え1
欲しいものがあれば説明するあなたはそれを要求しました:
export STY="for i in {0..3}; do echo \$i; done"
あなたが本当に意味するものが欲しいなら:
function STY() {
for i in {0..3}; do echo $i; done
}
export -f STY
答え2
つまり、eval "$hello"を使用してください。
(この回答はもともと次のように言いました:eval $helloを使用しましたが、他のポスターではeval "$hello"がより安全であると指摘しました。)
次のように:
bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'
単に行の先頭に$helloと言っても機能しません。 forループは$variable拡張の前に処理されるためです(ステップ指向言語は嫌いです)。
bash-2.05a$ $hello
bash: for: command not found
しかし、評価は機能します。
bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$
あなたが間違ったもの(または間違っている可能性があるもの):
bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$
つまり、少なくとも私が使用しているbashバージョンでは、{0..4}はあなたが思うように動作しません。
http://www.cyberciti.biz/faq/bash-for-loop/{0..4} 関数が bash 3.0 以降に現れるとしましょう。
たぶんあなたも私のように(家ではなくwoprkで)古いバージョンのbashを使用していますか?
答え3
$hello
期待どおりに機能しない理由:
- 拡張はトークンに分割した後、コマンドラインで行われます。
for...do...done
Compound Command
トークン化段階で決定されます。for
コマンドではありません。
したがって、次の操作を実行できません。
$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token `do'
Bashがコマンドラインをトークンに分割すると"for"
notが表示されるため、for
トークンはdo
予期しないものです。
あなたの場合:
$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found
Bashはtokenを探し、$hello
&&variable-expansion
はword-spliting
順番に発生します。
実際、bashは結果を次のように解析しますSimple Command
。
- command(
for
) は残りを args(i
,in
,{0..4}
,;
,do
, ...) として使用します。 for
、、、do
など;
はdone
特別な意味を失いました。
答え4
問題には2つの側面があります。
- 複雑な式を変数に保存
- 保存された式の実行
式を保存するにはエスケープシーケンスと特別な引用が必要になることがあります(あなたの例ではこれが本当のようです)。実行は 2 つの方法で行うことができます。
- Borealidの答えと同じ関数呼び出し:data = `STY()` - 関数の標準出力は変数に格納されます。
- 式の評価: データ =
eval $STY
例で提供される変数の定義