やりたいこと
以下のループ文でシングルクォートの中にダブルクォートやシングルクォートがネストになっている文字列の$i
を正しく動くようにしたい
test.sh(失敗)
for ((i=0 ; $i < 3 ; i++))
do
echo 'シングルクォートのネストのテスト。\'\""${i}"\"\''
done
このままだと1つ目の\'
のエスケープがなかったこと(文字列\
と'
扱い)にされて、以下のエラーが発生する。
エラー文
test.sh: line 3: unexpected EOF while looking for matching `''
test.sh: line 5: syntax error: unexpected end of file
解決方法
シングルクオートを切り離して文字列結合する。('
を一つの文字列とみなす)
test.sh(成功)
for ((i=0 ; $i < 3 ; i++))
do
# 以下のように書くことで成功します。ちなみにエスケープをしないとシングルクォートが通常の働きをしてしまうので注意です。
TMPVAR=シングルクォートのネストのテスト。\'\""${i}"\"\'
VAR=\'${TMPVAR}\'
echo $VAR
done
出力結果
'シングルクォートのネストのテスト。'"0"''
'シングルクォートのネストのテスト。'"1"''
'シングルクォートのネストのテスト。'"2"''
余談
筆者は上記はcurlコマンドをshellで作るときに使用しました。
上記の経緯はthirdパーティのnodeのapiがバグのような挙動を起こしていたためcurlによるapiに選択し直したというものでした。
そしてループ文を使ってコマンドを準備するときに苦労した部分が今回の内容だったので備忘録として残しました。