Open1

shellでの記法について

佐藤慧太佐藤慧太

書いてないと忘れるので、メモとして

変数

代入は=$をつけて参照できる。以下の場合適当な文字列というのが出力される

var=適当な文字列
echo $var

文字列に埋め込み

ダブルクオートで埋め込みをするほうが良い気がしている(個人的な感想で、別にそうしなくてもいい)

var=適当な文字列
echo "varは$varです"

この場合 varは??す になる。多分埋め込みはできるが、文字列として表示する際にマルチバイトなのかがわからんということな気がする。(これ以上はechoの話なので割愛)
マルチバイト文字でなければ普通に問題はない。

var=test
echo "varは$varです"

この場合 varはtestです になる。んじゃあどうするかってと{}でくくると良い。

var=適当な文字列
echo "varは${var}です"

その変数がなかった場合は何もなかったかのように無視される。以下の場合varはですになる

var=適当な文字列
echo "varは${var1}です"

シングルクオートの場合は本当に文字列として認識するので以下の場合は varは${var}です になる

var=適当な文字列
echo 'varは${var}です'

じゃあjson文字列とかどうする(jq使えばいいじゃんは一旦置いておき)。
よくあるslack通知。

var=適当な文字列
curl -X POST -w '\n' -H "Content-Type: application/json" -d '{ "channel": "#my_channel", "text": "varは${var}です" }' "https://hooks.slack.com/services/hogehoge"

シングルクオートでやるとダブルクオート入れられるから楽だなーと思いつつも、変数埋め込みしたい場合シングルクオートの場合はもちろん文字列として認識されるのでだめ、、、
じゃあ、中のダブルクオートをエスケープするかー、って考えるのはめんどい。って見てたときに以下のエントリにてヒアドキュメントを渡すパターンを見つけた
https://swfz.hatenablog.com/entry/2019/07/07/035341
ちょっと見やすいように順番変えて

var=適当な文字列
curl -X POST "https://hooks.slack.com/services/hogehoge" -w '\n' -H "Content-Type: application/json" -d @- <<EOS
{
  "channel": "#my_channel",
  "text": "varは${var}です"
}
EOS

とてもいい感じ