tips-jp

小ネタ集 (Tips written in Japanese)


Project maintained by KazKobara Hosted on GitHub Pages — Theme by mattgraham

shell script の小ネタ集(間違いやすい箇所のまとめ)

必要な背景知識

関数内での trap

set -o errtrace が無いと、関数内のエラー箇所でトラップされない。 テスト用コードはこちら。

set -e
set -o errtrace  # 関数内でも trap する場合に追加
trap 'echo "Error: line $LINENO returned $?!"' ERR

false_in_func () {
  echo "Before false"
  false
  echo "After false"
}

echo "Done"

複数行コメント中のシングルクオートとダブルクオート

: '
複数行のコメントはこれでも実現可能ですが、シングルクオートで挟まれたエリアはエスケープ記号も無視されるためエスケープしたとしてもシングルクオートを含められません。
ダブルクオート「"」は含められます。
'
: "
複数行のコメントはこれでも実現可能ですが、
ダブルクオートを含める際にはエスケープ「\"」が必要です。
"
: <<'COMMENT_EOF'
ここはシングルクオート「'」もダブルクオート「"」も
エスケープ無しで複数行をコメントアウトできます。
上部の COMMENT_EOF はクオートで挟んでも挟まなくてもよいですが、
下部の COMMENT_EOF はクオートしてはいけません。
COMMENT_EOF

複数行の標準入力をコマンドに渡す際(Here document)のシングルクオート、ダブルクオート、クオート無しの違い

cat <<'STD_INPUT_WITHOUT_EXPANSION_EOF'
ここから標準入力
右上のラベルをシングルクオートまたはダブルクオートで挟むと
変数やコマンド(${PWD}、`pwd`)は展開されません。
ここまで標準入力
STD_INPUT_WITHOUT_EXPANSION_EOF
cat <<STD_INPUT_WITH_EXPANSION_EOF
ここから標準入力
右上のラベルをシングルクオートで挟んでないと
変数やコマンド(${PWD}、`pwd`)は展開されます。
ここまで標準入力
STD_INPUT_WITH_EXPANSION_EOF

ちなみに、echo コマンドに渡す STRING のシングルクオート、ダブルクオート、クオート無しの違いは以下のとおり。

比較演算子としての “=” と “==” との違い

test、”[ ]”、”[[ ]]” の違い

リンク