コマンド置換の中かっこと角かっこの違い - ${}と$()

コマンド置換の中かっこと角かっこの違い - ${}と$()

bash(GNU bash、バージョン5.0.17)では、dateコマンドの出力を大文字で使用しようとしています。

date +"%d%m%Y"
# 30Dec2020

私は大文字を見つけました^^演算子は次のように使用されます。

DT="$(date +"%d%b%Y")"
echo ${DT^^} # works with curly braces
# 30DEC2020

echo $(DT^^) # fails with brackets
bash: DT^^: command not found

私は$ {}についてよく知らず、これが$()とどう違うのかわかりません。オンラインで確認してみるとみんな同じことをしているようでした。可変拡張。よろしくお願いします。

答え1

${}あらかじめ設定された変数には、ドル記号()を持つ中括弧が使用されます。次の例を見てください。

ThisIsAVariable=abc
echo ${ThisIsAVariable}
echo $ThisIsAVariable

最後のコマンドは同じ内容を印刷しますabc。ただし、場合によっては変数を中かっこで囲むと便利です。たとえば、スクリプトに隣接する2つの変数がある場合、中かっこを使用すると、ある変数を別の変数と明確に区​​別するのに役立ちます。たとえば、

echo ${ThisIsAVariable}${PWD}

シェルとこのスクリプトを読んでいる人は誰でも「ThisIsAVariable」と「PWD」が2つの異なる変数であることを簡単に知ることができます。

中かっこは変数配列を使用する唯一の方法であるため、重要です。次のファイルを含むディレクトリにあるとします1.txt。これを念頭に置いて、次の点を考慮してください。2.txt3.txt

file[0]=1.txt
file[1]=2.txt
file[2]=3.txt
echo $file
echo ${file[2]}

最初の3つのコマンドは単に変数を設定するため、出力はありません。しかし、4番目のコマンドは1.txt。この変数は、シェルに印刷する配列を明示的に知らせずに呼び出されるため、デフォルトは#0です。 5行目は印刷するので最も興味深いです3.txt。私がしたことはfile配列#2を使って変数を呼び出しただけです3.txt

中かっこを使用して実行できるその他の操作は次のとおりです。

x=123-45
echo ${x//-*}
echo $x

2番目のコマンドは、デフォルトで「ハイフンの後ろのすべてのエントリを削除します」と解釈されます。したがって、xはまだ文字列と同じですが、フィルタリングされています123-45-45最後のコマンドの出力は123-45期待どおりです。

校正器の拡張については学ぶことが多いですが…まあ…まだ学んだことがないので教え始めることもできませんね。

つまり、$()ドル記号()が付された括弧はcommand substitutionまったく異なることを意味します。デフォルトでは、プロセスの置き換えは、あるコマンドに別のコマンドのパラメータを生成させることです。この例を見てください。

ls
ls -l
ls $(echo -l)

最後の2つのコマンドの出力が同じであることをもう一度知ることができます。これは、最後の行に引数がecho与えられ、上記のコマンドと本質的に同じであるためです。時々あなたはただls-l必要あるプログラムの出力は別のプログラムの入力になり、自動化されます。これは難しいかもしれませんが、幸いなことにBASHのような* nixシェルを使うと十分これを達成する方法。 (この質問の範囲を超えているので言及しません。しかし、学ぶことができる場所を喜んで見つけるなら万能ガイドすぐに。興味深いです。 )

関連情報