私はLinuxターミナル用のシェルスクリプトを書いています。プロンプトで変数名を入力できるようにしたいです。たとえば、
テスト.sh:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
出力:
Enter input: $test
$test
read -p
スクリプトのプロンプト部分に「$test」と入力し、スクリプトが今のように「$test」をエコーするのではなく、最後に「Monkey in the middle...」をエコーするようにしたいと思います。
どうすればいいですか?
修正する:
こことここで私に提供された答えを使用してこのスレッド(貢献者と評論家に感謝します!)私は次の文を一つにまとめましたが、私は完璧にフィットしました。
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#_}