$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 | …
#!/bin/bash VALUE=10 if [[ VALUE -eq 10 ]] then echo "Yes" fi 驚いたことに、これは「はい」を出力します。私はそれが必要になると期待していたでしょう[[ $VALUE -eq 10 ]]。のCONDITIONAL EXPRESSIONSセクションをスキャンしましたがman bash、この動作を説明するものが見つかりませんでした。
${!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}}}必要な場合でも、単純に任意の深い置換を実行できない理由を理解することは決してないので、そのための説明もいいでしょう。
私が持っているスクリプトを見ています: if [ "${PS1-}" ]; then -PosixやBashの標準構文には見えないので、この最後のバグは少し気になります。それは永遠に存在していたこの難解な構文ですか、それともタイプミスですか?標準/ドキュメントへの参照をいただければ幸いです。 通常、私はそれをコーディングします: if [ "$PS1" ]; then どちらが正しいのですか、それとも違いがありますか?
これはできますが、変数の文字列を作成してから参照解除する必要があります。より単純なステートメントに短縮する方法はありますか? #!/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および他の多くの変種を、しかし、働いている唯一の方法は、文字列を使用することです。