Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー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