サーチ…


変数を割り当てるときの空白

空白は変数を割り当てるときに重要です。

foo = 'bar' # incorrect
foo= 'bar'  # incorrect
foo='bar'   # correct

最初の2つは構文エラーになります(または悪いことに、不正なコマンドを実行します)。最後の例は、変数$fooをテキスト "bar"に正しく設定します。

ファイルの最後の行が見つからない

Cの標準では、ファイルは改行で終わらなければならないと言われています。そのため、EOFが行末に来ると、その行はいくつかのコマンドで見逃されることはありません。例として:

$ echo 'one\ntwo\nthree\c' > file.txt

$ cat file.txt
one
two
three

$ while read line ; do echo "line $line" ; done < file.txt
one
two

上記の例で正しく動作するようにするには、最後の行が空でない場合にループを継続するようにテストを追加します。

$ while read line || [ -n "$line" ] ; do echo "line $line" ; done < file.txt
one
two
three

失敗したコマンドはスクリプトの実行を停止しません

ほとんどのスクリプト言語では、関数呼び出しが失敗すると、例外をスローしてプログラムの実行を停止することがあります。 Bashコマンドには例外はありませんが、終了コードがあります。 0でない終了コードは失敗を通知しますが、0以外の終了コードはプログラムの実行を停止しません。

これは危険な(確かに考案されたものの)状況につながります。

#!/bin/bash
cd ~/non/existent/directory
rm -rf *

場合はcdこのディレクトリへの-ingが失敗し、bashは失敗を無視し、スクリプトを実行した場所からディレクトリをきれいに拭い、次のコマンドを上に移動します。

この問題を処理する最良の方法は、 setコマンドを使用することです。

#!/bin/bash
set -e
cd ~/non/existent/directory
rm -rf *

set -eコマンドが0以外のステータスを返した場合、直ちにスクリプトを終了するように指示します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow