スクリプトに if [ $a = x ]; then って書いたら[: =: unary operator expected って出た
【疑問】変数が空のとき if の [ ] で unary operator expected。test と [ ]、ファイル・文字列・数値の比較、&& と ||【LPICレベル1】
前提のおさらい。コマンドは終わるときに終了ステータスを返して、0 が成功。直前の値は $?
>>1
a が空やったんやな。$a が消えて [ = x ] になって、形がおかしくなった。変数はダブルクォートで囲んで [ "$a" = x ] と書く。そうすると空でもエラーにならず、終了ステータス1(偽)
>>1
そもそも [ って何なん?
>>4
test コマンドの別の書き方で、最後に ] を付ける。type [ は「シェルの組み込み」、/usr/bin/[ という外のコマンドもある。条件が正しければ終了ステータス0を返すだけのコマンド
>>5[ のあとと ] の前に空白が要るのも、コマンドと引数やからか
>>5
ファイルを調べる-e ある、-f 普通のファイル、-d ディレクトリ-r -w -x 読める・書ける・実行できる-s 大きさが0より大きい(空のファイルは偽やった)A -nt B A のほうが新しい、-ot 古い
>>5
文字列と数値は書き方が違うん?
>>8
違う
文字列:= 同じ、!= 違う、-z 空、-n 空でない
数値:-eq -ne -lt -le -gt -ge
>>9[ 10 -lt 9 ] は偽、[ 10 \< 9 ](文字として比べる)は真やった。数を比べるなら -lt。[ abc -eq 1 ] は integer expression expected で終了ステータス2
>>5
否定は !、かつは -a、または は -o。[ ! -e ファイル ] でないとき
>>2
if の形は?
>>12if 条件; then … elif 条件; then … else … fi
条件の場所には [ ] だけやなくて、どんなコマンドでも書ける。if grep -q x file; then は x が見つかったら then のほう
>>13
短く書きたいときは?
>>14A && B は A が成功したときだけ B、A || B は A が失敗したときだけ Bmkdir d1 && echo made || echo exists を2回打ったら、1回目は made、2回目は exists
>>15A && B || C は、B が失敗したときも C が動くから、if と全く同じではない。分けたいときは if を使う
>>3
変数はクォート、文字は = で数は -eq、ファイルは -f と -d。if の条件はコマンドの成否、で整理できた
管理人のひとこと
[ 条件 ]は test コマンドと同じで、真なら終了ステータス0。[の後と]の前に空白が要る。変数は"$a"とクォートしないと、空のときに形が崩れてエラーになる。- ファイル:
-eある、-f普通のファイル、-dディレクトリ、-r・-w・-x、-s空でない、-nt・-ot新旧。 - 文字列:
=・!=・-z(空)・-n(空でない)。数値:-eq・-ne・-lt・-le・-gt・-ge。否定!、かつ-a、または-o。 if 条件; then …; elif …; else …; fiの条件にはどんなコマンドも書ける。A && Bは成功時だけ B、A || Bは失敗時だけ B。A && B || Cは B の失敗でも C が動く。