タグ付けされた質問 「variable-substitution」

1
bashでの感嘆符による変数置換
.cfg bashスクリプトファイルに次の行があります DDF_SOURCE="siebel_DATA_DATE_FORMAT" DATA_DATE_FORMAT=${!DDF_SOURCE} ${!DDF_SOURCE} はどのように評価されますか?それは!siebel_DATA_DATE_FORMAT、私には意味がありません。


4
1つの「while read」ループで変数がローカルになっているのに、一見似ているように見える別のループではないのはなぜですか?
$x以下のスニペットから異なる値を取得するのはなぜですか? #!/bin/bash x=1 echo fred > junk ; while read var ; do x=55 ; done < junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred | …

2
$ {PATH:+:$ {PATH}}はどういう意味ですか?
最近、私のcygwinプロファイルで、より正確に次のことに気付きました。 /usr/local/bin:/usr/bin${PATH:+:${PATH}} どういう意味ですか?なぜ$ PATHだけではないのですか?これは「$ PATHが存在する場合:$ PATHを追加する」ですか?私の目的は、順序を入れ替えて、cygwinパスをwindowsパスの後ろに置くことです。過去には $PATH:/usr/local/bin:/usr/bin しかし、これは私を混乱させます。たぶん私はやるべき PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin" $ PATHの最後に:を追加しますか?

7
bashおよびzshの二重および三重置換
この質問の背景部分へのフォローアップ。 で、二重置換にbash使用できます。両方で、旧式(hack-y)が機能します。${!FOO}zsh ${(P)FOO}eval \$$FOO したがって、私にとって最も賢明で最も論理的なことは${${FOO}}, ${${${FOO}}}…、double / triple / n置換です。なぜこれが期待どおりに機能しないのですか? 第二:何をするん\で行うevalの文?私はそれが脱出であり、eval \$$$FOO不可能なことをしていると考えています。すべてのシェルで動作するトリプル/ n置換を行う方法は?

4
別のスクリプトのコンテンツとして使用するために変数をエスケープします
この質問は、適切にエスケープされた文字列リテラルの書き方に関するものではありません。スクリプト内または他のプログラムで直接使用するために変数をエスケープする方法に関するものではない関連する質問は見つかりませんでした。 私の目標は、スクリプトが他のスクリプトを生成できるようにすることです。これは、生成されたスクリプト内のタスクが別のマシン上で0 回からn回実行され、それらの生成元のデータが実行前に(再び)変更される可能性があるため、ネットワークを介して直接操作を行うためですうまくいかない。 単一引用符などの特殊文字を含む可能性がある既知の変数がある場合、完全にエスケープされた文字列リテラルとして書き出す必要があります。たとえば、生成されたスクリプトにfoo含まれる変数bar'bazは次のようになります。 qux='bar'\''baz' これは"qux=$foo_esc"、スクリプトの他の行に追加することによって書き込まれます。私はこのようにPerlを使用してそれをやった: foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'" しかし、これはやり過ぎのようです。 私はbashだけでそれを行うことに成功していません。私はこれらの多くのバリエーションを試しました: foo_esc="'${file//\'/\'\\\'\'}'" foo_esc="'${file//\'/'\\''}'" しかし、余分なスラッシュが出力に表示されるか(私が実行した場合echo "$foo")、構文エラーが発生します(シェルから実行された場合、さらに入力が必要になります)。

2
文字列のbash変数の後にスペースを避ける方法は?
色の変数があります。文字列内で評価することにより、文字列に色を設定するために使用します。ただし、名前の後にスペースを含める必要があります(名前にテキストの一部が含まれないようにするため)。これは時々悪く見える。 このスペースの使用(印刷)を避けるにはどうすればよいですか? 例(と言うとRed=1、NC=2): echo -e "$Red Note: blabla$NC". 出力: 1 Note: blabla2. 期待される出力: 1Note: blabla2.

3
bashはパラメーター展開で後方参照をサポートしますか?
私が持っているという名前の変数descrの文字列を含むことができBlah: -> r1-ae0-2 / [123]、-> s7-Gi0-0-1:1-US / Fooなど私が取得したい-> r1-ae0-2、-> s7-Gi0-0-1:1-US文字列から一部を。現時点ではdescr=$(grep -oP '\->\s*\S+' <<< "$descr"これに使用しています。これを行うためのより良い方法はありますか?パラメータ拡張でこれを行うことも可能ですか?

1
式で$なしの変数展開が機能するのはなぜですか?
#!/bin/bash VALUE=10 if [[ VALUE -eq 10 ]] then echo "Yes" fi 驚いたことに、これは「はい」を出力します。私はそれが必要になると期待していたでしょう[[ $VALUE -eq 10 ]]。のCONDITIONAL EXPRESSIONSセクションをスキャンしましたがman bash、この動作を説明するものが見つかりませんでした。

4
シェルスクリプトを使用して変数のコンテンツを印刷することはできますか?(間接参照)
次の変数を宣言したとしましょう。 $ var='$test' $ test="my string" コンテンツを印刷すると、次のように表示されます。 $ echo $var $test $ echo $test my string のコンテンツ$var(のコンテンツ)を印刷する方法を見つけたい$testです。だから私は次のことをしようとしました: $ echo $(echo $var) $test しかし、ここで結果はそうでは$testありません"my string"... bashを使用して変数の内容の内容を印刷することは可能ですか?

4
$ {!FOO}およびzsh
${!FOO}で二重置換を実行しますbash。つまり、FOOの(文字列)値を取得し、変数名として使用します。 zshこの機能をサポートしていません。 この作業をbashandで同じにする方法はありzshますか? バックグラウンド: 次のような環境変数のリストがあります PATH MAIL EDITOR そして、最初に変数名を出力し、その後それらの値を出力したい。 これは動作しますbashが、動作しませんzsh: for VAR in LIST do echo $VAR echo ${!VAR} done それは何とか「古い方法」で可能になるはずですがeval、私はそれを動作させることができません: for VAR in LIST do echo $VAR echo `eval \$$VAR` done 必要な${${VAR}}場合でも${${${VAR}}}必要な場合でも、単純に任意の深い置換を実行できない理由を理解することは決してないので、そのための説明もいいでしょう。

3
「$ {PS1-}」は有効な構文であり、プレーンな「$ PS1」とどのように違いますか?
私が持っているスクリプトを見ています: if [ "${PS1-}" ]; then -PosixやBashの標準構文には見えないので、この最後のバグは少し気になります。それは永遠に存在していたこの難解な構文ですか、それともタイプミスですか?標準/ドキュメントへの参照をいただければ幸いです。 通常、私はそれをコーディングします: if [ "$PS1" ]; then どちらが正しいのですか、それとも違いがありますか?

1
デバッグ用のBash変数の展開を参照してください?
変数を展開してbashコードを読みやすくするためのツール/トリックはありますか? たとえば、次を変換します。 DIR=/var/tmp FILE=${DIR}/file SCRIPT_ROOT=/opt/root TOOL=${SCRIPT_ROOT}/tool.sh ${TOOL} ${FILE} に: DIR=/var/tmp FILE=/var/tmp/file SCRIPT_ROOT=/opt/root TOOL=/opt/root/tool.sh /opt/root/tool.sh /var/tmp/file 私はBASHコードをPythonに変換していますが、BASH構文を読むのは面倒です。

3
連結された変数名の逆参照
これはできますが、変数の文字列を作成してから参照解除する必要があります。より単純なステートメントに短縮する方法はありますか? #!/bin/bash FRUITS="BANANA APPLE ORANGE" BANANA_COLOUR="Yellow" APPLE_COLOUR="Green or Red" ORANGE_COLOUR="Blue" for fruit in $( echo $FRUITS ); do fruit_colour="${fruit}_COLOUR" echo $fruit is ${!fruit_colour} done 私はのようなものをたくさん試してみました${!"${fruit}_COLOUR"}か\$${fruit}_COLOURおよび他の多くの変種を、しかし、働いている唯一の方法は、文字列を使用することです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.