Linux ターミナル用のシェル スクリプトを書いています。プロンプトで変数名を入力できるようにしたいです。例:
テスト:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
出力:
Enter input: $test
$test
スクリプトのプロンプト セグメント中に「$test」と入力し、現在のように「$test」をエコーするのではなく、最後にスクリプトが「Monkey in the middle...」をエコーするようにしたいと考えread -p
ています。
どうすればそれを実行できるでしょうか?
アップデート:
ここで私に与えられた答えとこのスレッド(寄稿者とコメントを寄せてくれた方々に心から感謝します!)、私は自分にとって非常にうまく機能するこの行をなんとかまとめることができました。
newvariable="$(eval echo $input)"
ただし、eval を使用するとセキュリティ上のリスクが生じる可能性があると何度も警告されています。このソリューションを選択する場合は、その点に留意してください。
答え1
の代わりに
echo "$input"
試す
eval echo "$input"
これは bash 固有のものではなく、/bin/sh でも動作します。
は与えられたものを実行するだけなので、これは重大なセキュリティ リスクをもたらすことに注意してくださいeval
。この場合、シェルは文字列$input
を と解釈し$test
、eval
を実行しますecho $test
。しかし、ユーザーが と入力した場合はどうなるでしょうか$test; rm -rf *
。 eval
が表示されますecho $test; rm -rf *
。これを行う場合は十分に注意してください。
答え2
bashでは、間接パラメータ拡張構文:
test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}
この場合、ユーザーはtest
先頭にドル記号を付けずに文字列のみを提供する必要があります。
答え3
ユーザーがコマンド置換 を含めることで任意のコマンドを実行できることを気にしない限り$(…)
、文字列をeval
組み込み関数に送信できます。 はシェル スニペットを想定しており、入力に引用符が含まれている場合は構文エラーが発生する可能性があることに注意してくださいeval
。引用符に対処する (比較的) 簡単な方法は、ヒア ドキュメントを使用して置換を実行することです。それでも、終了していない変数やコマンド置換 (例$(foo
) に左右されます。
IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}