読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】変数が空のとき if の [ ] で unary operator expected。test と [ ]、ファイル・文字列・数値の比較、&& と ||【LPICレベル1】

17レスカテゴリ:Linux
1: 名無しさん

スクリプトに if [ $a = x ]; then って書いたら
[: =: unary operator expected って出た

2: 名無しさん

前提のおさらい。コマンドは終わるときに終了ステータスを返して、0 が成功。直前の値は $?

3: 名無しさん

>>1
a が空やったんやな。$a が消えて [ = x ] になって、形がおかしくなった。変数はダブルクォートで囲んで [ "$a" = x ] と書く。そうすると空でもエラーにならず、終了ステータス1(偽)

4: 名無しさん

>>1
そもそも [ って何なん?

5: 名無しさん

>>4
test コマンドの別の書き方で、最後に ] を付ける。type [ は「シェルの組み込み」、/usr/bin/[ という外のコマンドもある。条件が正しければ終了ステータス0を返すだけのコマンド

6: 名無しさん

>>5
[ のあとと ] の前に空白が要るのも、コマンドと引数やからか

7: 名無しさん

>>5
ファイルを調べる
-e ある、-f 普通のファイル、-d ディレクトリ
-r -w -x 読める・書ける・実行できる
-s 大きさが0より大きい(空のファイルは偽やった)
A -nt B A のほうが新しい、-ot 古い

8: 名無しさん

>>5
文字列と数値は書き方が違うん?

9: 名無しさん

>>8
違う
文字列:= 同じ、!= 違う、-z 空、-n 空でない
数値:-eq -ne -lt -le -gt -ge

10: 名無しさん

>>9
[ 10 -lt 9 ] は偽、[ 10 \< 9 ](文字として比べる)は真やった。数を比べるなら -lt。[ abc -eq 1 ] は integer expression expected で終了ステータス2

11: 名無しさん

>>5
否定は !、かつは -a、または は -o。[ ! -e ファイル ] でないとき

12: 名無しさん

>>2
if の形は?

13: 名無しさん

>>12
if 条件; then … elif 条件; then … else … fi
条件の場所には [ ] だけやなくて、どんなコマンドでも書ける。if grep -q x file; then は x が見つかったら then のほう

14: 名無しさん

>>13
短く書きたいときは?

15: 名無しさん

>>14
A && B は A が成功したときだけ B、A || B は A が失敗したときだけ B
mkdir d1 && echo made || echo exists を2回打ったら、1回目は made、2回目は exists

16: 名無しさん

>>15
A && B || C は、B が失敗したときも C が動くから、if と全く同じではない。分けたいときは if を使う

17: 名無しさん

>>3
変数はクォート、文字は = で数は -eq、ファイルは -f と -d。if の条件はコマンドの成否、で整理できた

管理人のひとこと