SSブログ

シェルスクリプトの変数と文字列でハマった話。 [プログラミング]

業務アプリというか簡単なシステムをシェルスクリプトで組んでしんどかった時のお話。
基本的なところはワンライナーでできていたんだけど、シェルスクリプトで出力を変数で持ったりして、実際の最終的な出力を加工して出していたりしていた。

だけど、シェルスクリプトでの複数行の文字列の扱い方が気持ち悪くて往生した。まず、普通に複数行で書けなかった。

https://takuya-1st.hatenablog.jp/entry/2017/03/22/144700

複数行にべったり書くと何か引っかかっていて、ヒアドキュメントだとなんとなく上手くいっていた(気がした)。最終的には変数の書き方がダメだったのですが、それは後で書くことにします。出力の時になぜか改行が省略される。なぜだ。

https://jehupc.exblog.jp/15728862/

改行ありの出力は変数を""で囲わないといけないとか、記法的に直観性がない。${VAR}を"${VAR}"にしないといけないとか、やったことがないと思いつかない。とにかく、改行が付かなくてダラダラ一行になってしまうのキツイ。改行を省略してしまう理由ってなんなんだろう。


あと改行文字を入れるのも厳しくて、\nと書いても気にしてくれずにそのまま出る。基本的にエスケープ処理はしてくれないらしい。

https://qiita.com/kkdd/items/6b0534b3b64639ac3e25

改行文字を入れるだけなのに、こんなにも七面倒くさい。まぁお作法的に入れればいいだけなんだけど、何度も別のところで使うとなると、その一手間が煩わしい。


空白行を入れるのも面倒くさいかな。echoで出せばいいと書いているところもあるんだけど、変数を""で囲っても変数の末尾の空行は出力の時に省略されてしまったような気がした。これもやり方に寄るんだろうけど、その時はなんで省略してしまうんだと憤慨していた。

https://www.mussyu1204.com/wordpress/it/?p=308

結局、空行や改行を簡潔に書くには上のようにechoで出すのがわかりやすいのだろうか。というか、普通のプログラミング言語に比べて、変数の中の改行文字の扱いが面倒すぎる気がする。まぁもっとシェルスクリプトが書きやすかったら、スクリプト言語なんてあまり出てこなかったんだろうけどね。




あとこれが一番書きたかったことなんだけど、意味の分からない所で
+=: command not found

とか出ていて、普通に変数に足して代入しているだけなのになと思っていたら、変数を先頭にする場合は、$が必要ないのを初めて知った(たぶん)。今まで変数宣言以外は$を付けないといけないと思っていたけど、行の先頭だけは要らないというシェルスクリプトの仕様を知った。というか行中に書く時は$を付けないといけないと書いた方がいいのかな?

PHPとかはずっと付けないといけないし、他の言語の変数はプリフィックスがない方が普通だ。どちらにしても気持ち悪い。そもそも変数と=の間に空白入れちゃいけないっぽいのも気に食わない。これに関しては空白を許可しない意味がある(ワンライナー的に)ので仕方のないことかもしれないが、普通に読みにくいでしょ。


なので
$VAR+="文字列とか"

はダメで
VAR+="文字列とか"

としないと意味の分からないcommand not foundになってしまう。もちろん実際にコマンドがあるなしにかかわらずコケるので、わけのわからないコマンドがないエラーメッセージが出たら、ノリで$が付いていないか調べるといいと思います。


なんにしても普通のコンピュータ言語のように、すんなり文字列を扱えないというのは確かな話で、ちょっと試行錯誤は必要かなと。とりあえずはこのハマりは抜けたので良しとしよう。というか、普通の人は簡単に気付いているのかな? というか、旧コンピュータ的なエラーメッセージはどうにかならないかと思うのだが。そういう意味ではRustのコンパイルエラーはわりあいと親切なのがわかる。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0