Ansatzの備忘録

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

シェルワンライナー160本ノック問題13

問題13 存在しないファイルの初期化

シェルスクリプトで存在するかどうかわからないファイルを cat で何回も参照したいという状況を考える。touch で空ファイルを作成しておくと便利だが、すでに存在しているファイルの場合はタイムスタンプが更新されてしまう。ではファイルがあった場合はタイムスタンプを更新せず、ファイルが存在しない場合でもエラーが出ないようにするにはどうすればよいか。というのが今回の問題だった。

[ -e unfile ] || touch unfile

あるいは

cat <> unfile

などが正解となる。

テストコマンド [] は練習問題でも出てきたが全然頭に入ってなかった。 -e でファイルの有無を判定するようになる。テストコマンドはもともと2つの値を比較するために用いられる。[ 10 -gt "$a"] など。

<>については、

リダイレクト演算子

              [n]<>word

を使うと、 word を展開した結果の名前を持つファイルがファイル・ディスクリプター n  での読み書きのためにオープンされます。 n が指定されていなければ、 ファイル・ディスクリプター 0 で読み書きが行われます。 ファイルが存在しなければ、新しく生成されます。

と man bash に書いてあった。そういう仕様らしい。