このフォームは何ですかvariable = $(…)


9

次の意味は何ですか。

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

私はこの部分に特に興味があります:

varible=$(...)

括弧がサブプロセスの実行に使用されていることは知っていますが、括弧を一緒に使用すると$どうなりますか?


3
bashを使用している場合:を介してmanページをman bash
調べ

回答:


16

Bashマニュアル(man bash)から:

   コマンド置換
       コマンド置換により、コマンドの出力が
       コマンド名。2つの形式があります。

              $(コマンド)
       または
              「コマンド」

       bashは、サブシェルでコマンドを実行することによって拡張を実行します
       環境とコマンド置換を標準に置き換える
       末尾の改行が削除されたコマンドの出力。埋め込み
       改行は削除されませんが、単語の途中で削除される場合があります
       分割。コマンド置換$(cat file)は、
       同等ですが高速な$(<ファイル)。

(これは、すべてのBourneシェルのような、すなわちのためにも当てはまるshkshzshbashなど、そしてzshまた、このように埋め込まれたNUL文字でデータをキャプチャすることができます)

コマンド

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

スクリプトが配置されているディレクトリの名前を(すべてのバックスラッシュをスラッシュに変更しながら)変数に割り当てますbasedir。標準エラーストリームに出力されるエラー、警告、またはその他の診断メッセージは、引き続き端末に表示されます($(...)コマンドの標準出力のみをキャプチャします)。

シェルは、最も内側のコマンド置換を実行することから始めます。

echo "$0" | sed -e 's,\\,/,g'

その出力は文字列としてに与えられdirname、その出力は変数に割り当てられますbasedir

二重引用符は、単語分割やファイル名の展開が行われないようにするためのものです。そうしないと、$0(スクリプトの実行に使用するパスを含むスクリプトの名前)にスペースが含まれていると、スクリプトが失敗したり、奇妙な出力が生成されたりする場合があります。文字またはファイル名のグロビング文字(?またはなど*)。

一般に、常に展開(変数展開、コマンド置換、および算術展開)を引用することをお勧めします。これが良いアイデアである理由についての優れた説明については、この質問とその回答を参照してください。

スクリプトが次のように実行された場合

$ /usr/local/bin/script.sh

次にbasedirの値を取得します/usr/local/bin

または、Cygwinで:

$ bash c:\\Users\\Me\\script.sh

次にbasedirの値を取得しますc:/Users/Me。この場合のコマンドラインでの二重円記号は、シェルから単一の円記号をエスケープするためのものです。の実際の値は$0ですc:\Users\Me\script.sh

もう使用しなくても同じことを行う方法dirnameechoおよびsedだろう

basedir="${0//\\//}"
basedir="${basedir%/*}"

おかげで、基本的に最も内側の括弧から解析を開始しますね?そして、なぜ引用が使用されているのですか?
Maxim Koretskyi 2017年

@Maximus正解。回答を更新しました。
クサラナンダ

多分あなたは「すべてのボーンのようなシェルに当てはまる」と言うべきです。その方法をもう少し明確に
セルギー・コロディアズニー2017年

@ Serg、Bourneシェル(/bin/shSolaris 10以前のものと同様)はをサポートしていません$(...)
ステファンChazelas

@StéphaneChazelas私はこれを組み込みます。
クサラナンダ

6

それはすることを意味し実行内側にあるものを括弧サブシェルリターンとしてその値は、あなたのケースでにそれを割り当てますvarible


5

varible=$(..)呼ばれるコマンド置換およびそれの手段にすぎないが、シェルコマンドを実行して、echoコマンドを使用して、変数またはディスプレイ背面にその出力を格納します。たとえば、日付と時刻を表示します。

echo "Today is $(date)"

そしてそれを変数に保存するために:

SERVERNAME=$(hostname)

詳細:https : //www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

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