シェルワンライナー160本ノック問題29
問題29 シェルスクリプトのエラーチェック
問題のファイルは
https://github.com/shellgei/shellgei160
からダウンロードできる。
fb.bash を実行しないで構文エラーの位置を特定する問題だった。bash の -n オプションを使うとできる。すなわち
bash -n fb.bash |& awk -F'[: ]' '!a[$4]++{print $4}'
とすればいい。[: ]でコロンと半角スペースを区切り文字に指定することで行数が4番目にくる。bash -n fb.bash だけだと
fb.bash: 行 6: 条件式に構文エラーがあります
fb.bash: 行 6: `;' 周辺に構文エラーがあります
fb.bash: 行 6: ` if [[ $*1 == 0 ]; then'
という出力になることを踏まえて awk を使っている。このワンライナーを読んでいてなんか引っかかるなと思ったら awk における真偽値と bash におけるそれを混同していた。
awk においては
- 数字の0(ゼロ)は「偽」となります。
- 空の文字列は「偽」となります。
- 上記以外は全て「真」となります。
https://codezine.jp/article/detail/7752
となり、bash では逆に0が真で1が偽になる。だからこんな書き方をしているわけだ。
*1: i % 3