カッコの使い方

PowerShell 書き方 カッコ
関数にカッコが書いてあったり、文字列にカッコが書いてあったり、$()や${}や$がないただの()だったり色々で混乱しました。
文字列内で変数が展開されない、というのもカッコの使い方が誤っていたためでした。
今では、そんなことは遠いカッコのこと、カッコの使い方はばっちしです。
そんなわけで、結構大事なカッコの使い方についてまとめました。
基本
カッコはコマンドや計算の結果を変数のように扱うためのくくりとして使います。
※実際は変数になっているわけではなく、変数っぽく扱うことができると理解しておけばよいと思います。
単純に、
$file_list = Get-ChildItem “c:\aaa\*.txt”
の場合はカッコが不要ですが、
$data = (Get-ChildItem “c:\aaa\*.txt”)[0]
のように、返却されたファイル名のリストの先頭を取得する場合は、いったん返却されたリストを変数として扱うためにカッコが必要になります。
※ここでのGet-ChildItemはdirやlsのようなもの
基本その2
コマンドの引数の区切りとしてもカッコは使います。
$file_list = Get-ChildItem Join-Path “c:\aaa” “*.txt”
※Join-Pathはパスを連結するコマンド
のように記載すると、Join-PathがGet-ChildItemの引数として認識されてしまいエラーになってしまいます。
$file_list = Get-ChildItem (Join-Path “c:\aaa” “*.txt”)
カッコでくくることにより、Join-Pathの結果を変数として扱うことになり、その結果がGet-ChildItemの引数になります。
文字列内で変数に使うカッコ
$abc = "ABC"
$def = "DEF"
コード | 結果 | 判定 | 説明 |
“$abc/$def” | “ABC/DEF” | OK | /が区切り |
“$abc_$def” | “DEF” | NG | $abc_まで が変数 |
“$abc[0]$def” | “ABC[0]DEF” | NG | [0]が文字列 扱い |
“($abc)_($def)” | “(ABC)_(DEF)” | NG | ()が文字列 扱い |
“$($abc)_$($def)” | “ABC_DEF” | OK | $()内の値を 変数として 扱う |
“${abc}_${def}” | “ABC_DEF” | OK | ${}は変数 として扱う |
“${abc}[0]_${def}” | “ABC[0]_DEF” | NG | [0]が文字列 扱い |
“${abc[0]}_${def}” | “_DEF” | NG | |
“$(${abc}[0])_${def}” | “A_DEF” | OK | $()内の値を 変数として 扱う |
“$($abc[0])_$def” | “A_DEF” | OK | $()内の値を 変数として 扱う |
文字列内に変数を埋め込む場合は、変数を$()でくくりましょう。
()と$()の違い
($abc)は、カッコ内の結果を変数と同様に扱うことができるようにするのに対して、$($abc)は(確証はありませんが実験結果からすると)新たな変数を生成します。
($abc) = “aaaaa” はエラーになりませんが、
$($abc) = “aaaaa”はエラーになります。
($abc) = “aaaaa”は、$abc = “aaaaa” と同じ結果になるので、()はあくまでくくりとして使用されていることになります。
()と${}の違い
スペースを含む変数を定義したい場合は${}を使用する必要があります。
${abc def} = “test”
ただ、${}の場合、「文字列内で変数に使うカッコ」でみたとおり、${abc}[0]を文字列に埋め込むことができません。埋め込むためには$(${abc}[0])としなければならず、だったら最初から$($abc[0])としたほうがすっきりします。
よって、独断になりますが、${}はPowerShellらしくないと判定します。
※変数名にスペースを使わない前提
結論
文字列以外では、コマンドや計算結果をくくるために()を使いましょう。
文字列では、変数名が認識されるように変数を、$()でくくりましょう。
※ただし、$()は新しく変数を生成しているっぽいので文字列以外では()を使いましょう。
${}はPowerShellっぽくないです(独断)。