- 技術 💻
シェルスクリプトif条件式一覧|bash文字列比較・ファイル存在確認早見表
シェルスクリプトのif条件式とは、[ ](test)・[[ ]]・(( )) のいずれかで「真か偽か」を判定し、その終了ステータス(0が真)でifの分岐を決める仕組みです。 文字列は =、数値は -eq、ファイルの存在は -e/-f/-d を使う、という3つを押さえれば、日常のスクリプトの大半は書けます。
この記事では、条件式の全演算子を1つの早見表にまとめ、すべて bash 5.2.21 で実行した結果(true/false) を載せています。さらに、[ ] と [[ ]] と (( )) の違い、=~ 正規表現と BASH_REMATCH、unary operator expected や [: missing ']' などのよくあるエラーを実際に再現して直す手順、sh(dash)で [[ が使えない理由、case や && || との使い分けまで扱います。if文の基本構文やシェルスクリプト全体の書き方は別記事「シェルスクリプトの書き方」に任せ、ここでは条件式そのものに集中します。
if条件式の早見表
迷ったら bash では [[ ]]、数値計算は (( ))、sh 互換が必要なら [ ] を使います。 下の表はすべて bash 5.2.21(Ubuntu、GNU coreutils 9.4)での確認結果です。
| やりたいこと | 書き方(bash推奨) | sh互換の書き方 | 真になる条件 |
|---|---|---|---|
| 文字列が等しい | [[ $a == "abc" ]] |
[ "$a" = "abc" ] |
完全一致 |
| 文字列が異なる | [[ $a != "abc" ]] |
[ "$a" != "abc" ] |
不一致 |
| 空文字か | [[ -z $a ]] |
[ -z "$a" ] |
長さ0 |
| 空でないか | [[ -n $a ]] |
[ -n "$a" ] |
長さ1以上 |
| 辞書順で小さい | [[ $a < $b ]] |
[ "$a" \< "$b" ] |
ロケールの照合順 |
| 前方一致・後方一致・部分一致 | [[ $f == *.txt ]] |
case を使う |
パターンに一致 |
| 正規表現 | [[ $s =~ ^[0-9]+$ ]] |
expr や grep -E |
正規表現に一致 |
| 数値が等しい | (( a == b )) |
[ "$a" -eq "$b" ] |
整数として等しい |
| 数値が大きい/以上 | (( a > b )) (( a >= b )) |
-gt -ge |
整数比較 |
| 数値が小さい/以下 | (( a < b )) (( a <= b )) |
-lt -le |
整数比較 |
| 数値が異なる | (( a != b )) |
-ne |
整数比較 |
| ファイルかディレクトリが存在 | [[ -e $p ]] |
[ -e "$p" ] |
種類を問わず存在 |
| 通常ファイルが存在 | [[ -f $p ]] |
[ -f "$p" ] |
通常ファイル |
| ディレクトリが存在 | [[ -d $p ]] |
[ -d "$p" ] |
ディレクトリ |
| サイズが0より大きい | [[ -s $p ]] |
[ -s "$p" ] |
中身がある |
| 読める/書ける/実行できる | -r -w -x |
同じ | 権限がある |
| シンボリックリンク | [[ -L $p ]] |
[ -L "$p" ](-h も同じ) |
リンクそのもの |
| 新しい/古い | [[ $a -nt $b ]] [[ $a -ot $b ]] |
同じ | 更新日時の比較 |
| 変数が定義済み | [[ -v name ]] |
[ -n "${name+x}" ] |
空でも定義済みなら真 |
| かつ/または/否定 | && || !([[ ]] 内) |
[ ] && [ ]、! |
論理演算 |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シェルスクリプトif条件式一覧|bash文字列比較・ファイル存在確認早見表」
[ ]・test・[[ ]]・(( )) の違いを比較表で整理する
[ は test コマンドの別名、[[ は bash の構文(キーワード)、(( は算術評価です。 見た目は似ていますが、作りが違うため、クォートの要否やエラーの出方が変わります。
| 項目 | [ ] / test |
[[ ]] |
(( )) |
|---|---|---|---|
| 正体 | コマンド(組み込み+/usr/bin/[) |
bash のキーワード | 算術評価の構文 |
| POSIX sh(dash)で使える | 使える | 使えない | 使えない($(( )) の展開は可) |
| 変数のクォート | 必須("$a") |
原則不要 | 不要($ も省略可) |
| 単語分割・グロブ展開 | される | されない | ― |
文字列の < > |
\< \> とエスケープ |
そのまま書ける | 数値比較になる |
パターン一致(*.txt) |
できない | == の右辺で可 |
― |
正規表現 =~ |
できない | できる | ― |
| AND / OR | -a -o(非推奨)か [ ] && [ ] |
&& || |
&& || |
| 数値比較 | -eq -lt など |
-eq -lt など |
== < >= など |
| 主な用途 | sh 互換スクリプト | bash の文字列・ファイル判定 | 整数の比較・計算 |
[ はコマンドなので、[ の後ろと ] の前にスペースが必要です。[ という名前のコマンドに引数を並べ、最後の引数が ] という決まりになっているためです。
$ type [ [[
[ is a shell builtin
[[ is a shell keyword
$ type '(('
bash: line 1: type: ((: not found
(( は type では見つかりませんが、bash の複合コマンドとして解釈されます。
速度の違い(参考)
[[ ]] はコマンド呼び出しではなく構文なので、繰り返しが多いループでは少し速くなります。bash 5.2.21 で10万回比較した結果です。
time (for i in $(seq 100000); do [ "$i" = x ]; done)
time (for i in $(seq 100000); do [[ $i = x ]]; done)
real 0m0.279s # [ ]
real 0m0.127s # [[ ]]
差は10万回で0.15秒ほどなので、速度より読みやすさで [[ ]] を選ぶのがおすすめです。
文字列比較の演算子一覧(実行結果つき)
文字列の等号は =([[ ]] では == も可)、空チェックは -z/-n です。 次のスクリプトを bash 5.2.21 で実行しました。
#!/usr/bin/env bash
t(){ if eval "$1"; then r=true; else r=false; fi; printf '%-32s -> %s\n' "$1" "$r"; }
a=apple; b=banana; empty=""
for e in '[ "$a" = apple ]' '[ "$a" == apple ]' '[ "$a" != "$b" ]' \
'[ -z "$empty" ]' '[ -n "$a" ]' \
'[[ "$a" < "$b" ]]' '[[ "$a" > "$b" ]]' '[ "$a" \< "$b" ]'; do t "$e"; done
[ "$a" = apple ] -> true
[ "$a" == apple ] -> true
[ "$a" != "$b" ] -> true
[ -z "$empty" ] -> true
[ -n "$a" ] -> true
[[ "$a" < "$b" ]] -> true
[[ "$a" > "$b" ]] -> false
[ "$a" \< "$b" ] -> true
| 演算子 | 意味 | [ ] |
[[ ]] |
備考 |
|---|---|---|---|---|
= |
等しい | 可 | 可 | POSIX 標準 |
== |
等しい | bash では可 | 可 | dash では unexpected operator |
!= |
異なる | 可 | 可 | |
-z |
長さ0 | 可 | 可 | 未定義変数も真 |
-n |
長さ1以上 | 可 | 可 | [ ] では必ずクォート |
< > |
辞書順比較 | \< \> |
可 | 数値比較ではない |
< > は辞書順(文字の並び順)の比較なので、数値に使うと意図と違う結果になります。
x=10; y=9
[ $x -gt $y ] -> true
(( x > y )) -> true
[ "$x" \> "$y" ] -> false # "1" と "9" を文字で比べている
[[ $x > $y ]] -> false
数値は -gt か (( ))、文字列は == < と使い分けると迷いません。
数値比較の演算子一覧(実行結果つき)
整数の比較は -eq -ne -gt -ge -lt -le、または (( )) の中で == != > >= < <= を使います。
x=10; y=9
[ $x -eq 10 ] -> true
[ $x -ne $y ] -> true
[ $x -gt $y ] -> true
[ $x -ge 10 ] -> true
[ $x -lt $y ] -> false
[ $x -le 10 ] -> true
(( x > y )) -> true
(( x == 10 )) -> true
[[ $x -gt $y ]] -> true
[ ] / [[ ]] |
(( )) |
意味(英語の由来) |
|---|---|---|
-eq |
== |
equal:等しい |
-ne |
!= |
not equal:異なる |
-gt |
> |
greater than:より大きい |
-ge |
>= |
greater or equal:以上 |
-lt |
< |
less than:より小さい |
-le |
<= |
less or equal:以下 |
(( )) の中では変数の $ を省略でき、&& || もそのまま使えます。 ただし、扱えるのは整数だけです。小数を比べたいときは awk や bc を使います。
v=1.5
if awk -v v="$v" 'BEGIN{exit !(v > 1)}'; then echo "1より大きい"; fi
ファイル存在確認の演算子一覧(実行結果つき)
存在確認は -e(なんでも)、-f(通常ファイル)、-d(ディレクトリ)の3つを目的で選びます。 次の準備をしてから全演算子を確かめました(root で実行)。
echo hello > file.txt # 中身あり
: > empty.txt # 0バイト
mkdir -p dir
ln -sf file.txt link # シンボリックリンク
printf '#!/bin/sh\n' > run.sh; chmod +x run.sh
touch -d '2026-01-01' old.txt
touch -d '2026-06-01' new.txt
[ -e file.txt ] -> true
[ -e nofile ] -> false
[ -f file.txt ] -> true
[ -f dir ] -> false
[ -d dir ] -> true
[ -s file.txt ] -> true
[ -s empty.txt ] -> false
[ -r file.txt ] -> true
[ -w file.txt ] -> true
[ -x run.sh ] -> true
[ -x file.txt ] -> false
[ -L link ] -> true
[ -h link ] -> true
[ -f link ] -> true
[ new.txt -nt old.txt ] -> true
[ old.txt -ot new.txt ] -> true
[ link -ef file.txt ] -> true
| 演算子 | 真になる条件 | 使いどころ |
|---|---|---|
-e |
存在する(種類は問わない) | 「何かある」か確認 |
-f |
通常ファイル | 設定ファイル・入力ファイル |
-d |
ディレクトリ | 出力先フォルダ |
-s |
サイズが0より大きい | 空ファイルを除外 |
-r |
読み取り可能 | 入力前の確認 |
-w |
書き込み可能 | 出力前の確認 |
-x |
実行可能(ディレクトリなら入れる) | コマンドの存在確認 |
-L / -h |
シンボリックリンク | リンク切れの検出 |
-p |
名前付きパイプ | FIFO の確認 |
-S |
ソケット | デーモンのソケット |
-b / -c |
ブロック/キャラクタデバイス | /dev 配下 |
-t FD |
FD が端末につながっている | 対話か判定([ -t 0 ]) |
A -nt B |
A の更新日時が B より新しい | 再ビルドの要否 |
A -ot B |
A の更新日時が B より古い | 古い成果物の検出 |
A -ef B |
同じ実体(同じ inode) | リンク先の一致確認 |
押さえておきたい3つの挙動です。
-fや-eはシンボリックリンクの先を見ます。 上の例で[ -f link ]が true なのはリンク先のfile.txtが通常ファイルだからです。リンク先が消えた「リンク切れ」は[ -L p ] && [ ! -e p ]で検出できます。- root で実行すると
-r-wはほぼ常に true になります(権限チェックを素通りするため)。権限の確認は一般ユーザーで試すと正確です。 -ntは片方が存在しないとき、存在する方を「新しい」とみなします(bash のマニュアルの CONDITIONAL EXPRESSIONS に記載)。
ファイル存在確認のコピペ例
#!/usr/bin/env bash
conf="./app.conf"
outdir="./out"
if [[ -f $conf ]]; then
echo "設定ファイルを読み込みます: $conf"
else
echo "設定ファイルがありません: $conf" >&2
fi
# ディレクトリが無ければ作る
[[ -d $outdir ]] || mkdir -p "$outdir"
# リンク切れを検出
for p in ./*; do
if [[ -L $p && ! -e $p ]]; then echo "リンク切れ: $p"; fi
done
論理演算(AND・OR・NOT)の書き方
bash では [[ 条件1 && 条件2 ]]、sh 互換なら [ 条件1 ] && [ 条件2 ] と書きます。 -a -o は POSIX で非推奨(廃止予定)とされているので、新しく書くときは && || を使います。
[ -f file.txt ] && [ -d dir ] -> true
[ -f file.txt -a -d dir ] -> true
[[ -f file.txt && -d dir ]] -> true
[ -f nofile ] || [ -d dir ] -> true
[[ -f nofile || -d dir ]] -> true
[ ! -e nofile ] -> true
[[ ! -e nofile ]] -> true
(( x > 5 && y < 5 )) -> false
グループ化は [[ ]] ならそのまま ( )、[ ] なら \( \) とエスケープします。
[[ 1 -eq 1 && ( 2 -gt 3 || 3 -gt 2 ) ]] && echo group # group
[ 1 -eq 1 -a \( 2 -gt 3 -o 3 -gt 2 \) ] && echo group2 # group2
変数が定義されているか確認する(-v と -z の違い)
「空文字」と「未定義」を区別したいときは [[ -v 変数名 ]] を使います(bash 4.2 以降)。-z は両方とも真になります。
unset a; b=""
[[ -v a ]] && echo a-set || echo a-unset
[[ -v b ]] && echo b-set
arr=(1 2); [[ -v arr[1] ]] && echo idx1
a-unset
b-set
idx1
-v には $ を付けず、変数名を書く点に注意します。sh 互換で同じことをするなら [ -n "${a+x}" ](定義済みなら x に置き換わる)を使います。
=~ 正規表現と BASH_REMATCH の使い方
[[ 文字列 =~ 正規表現 ]] で拡張正規表現(ERE)に一致するか判定でき、( ) で囲んだ部分は配列 BASH_REMATCH に入ります。
#!/usr/bin/env bash
d="2026-10-02"
if [[ $d =~ ^([0-9]{4})-([0-9]{2})-([0-9]{2})$ ]]; then
echo "all=${BASH_REMATCH[0]} y=${BASH_REMATCH[1]} m=${BASH_REMATCH[2]} d=${BASH_REMATCH[3]}"
fi
email="user@example.com"
re='^[^@]+@[^@]+\.[a-z]+$'
[[ $email =~ $re ]] && echo "email ok"
[[ $email =~ "$re" ]] && echo "quoted match" || echo "quoted: literal, no match"
all=2026-10-02 y=2026 m=10 d=02
email ok
quoted: literal, no match
| ポイント | 説明 |
|---|---|
BASH_REMATCH[0] |
一致した全体 |
BASH_REMATCH[1] 以降 |
( ) で囲んだグループの順番 |
| 右辺はクォートしない | "$re" と囲むと正規表現ではなく文字列として比較される |
| 複雑な正規表現は変数に入れる | re='...' にしてから =~ $re と書くとエスケープで迷わない |
\d は使えない |
ERE なので [0-9] や [[:digit:]] を使う |
正規表現を変数に入れて、右辺はクォートなしで書く。これが =~ を安定して使うコツです。
パターンマッチ(== *.txt)で前方一致・部分一致を判定する
[[ ]] の == の右辺はグロブ(ワイルドカード)として扱われるので、拡張子や部分一致を手軽に判定できます。
f="report.txt"
[[ $f == *.txt ]] && echo "glob match"
[[ $f == "*.txt" ]] && echo "quoted glob" || echo "quoted glob: literal, no match"
[ "$f" == *.txt ] && echo "[ glob" || echo "[ : no glob match"
[[ $f == report.@(txt|csv) ]] && echo "extglob ok"
s="Hello World"
[[ ${s,,} == hello* ]] && echo "case-insensitive ok"
[[ $s == *World* ]] && echo "contains"
glob match
quoted glob: literal, no match
re.sh: line 12: [: too many arguments
[ : no glob match
extglob ok
case-insensitive ok
contains
3行目の [ ] では *.txt がカレントディレクトリのファイル名に展開され、too many arguments になりました。 [ ] はパターンマッチに対応していないので、sh 互換で書くときは case を使います。
| やりたいこと | 書き方 |
|---|---|
| 前方一致 | [[ $s == abc* ]] |
| 後方一致 | [[ $s == *.log ]] |
| 部分一致 | [[ $s == *error* ]] |
| いずれかの拡張子 | [[ $f == *.@(jpg|png) ]] |
| 大文字小文字を無視 | [[ ${s,,} == *error* ]](${s,,} で小文字化) |
| パターンではなく文字として比較 | 右辺をクォート [[ $s == "*" ]] |
よくあるエラーを再現して直す
ここからは、実際に bash 5.2.21 で再現したエラー文と直し方です。
unary operator expected(空の変数)
変数が空のとき、クォートしない [ $name = "admin" ] は [ = "admin" ] になり、引数が足りずにエラーになります。
name=""
if [ $name = "admin" ]; then echo admin; else echo other; fi # 直す前
if [ "$name" = "admin" ]; then echo admin; else echo other; fi # 直した後
if [[ $name = "admin" ]]; then echo admin; else echo other; fi # bash ならこれも可
err.sh: line 3: [: =: unary operator expected
other
other
other
数値比較でも同じです。
n=""
[ $n -eq 0 ] -> [: -eq: unary operator expected
[ "$n" -eq 0 ] -> [: : integer expression expected
クォートすれば構文エラーは消えますが、空文字は整数ではないので integer expression expected が出ます。 数値として扱う前に ${n:-0} で既定値を入れると安定します。
[ "${n:-0}" -eq 0 ] && echo zero # zero
[ の前後スペース忘れ(command not found / missing ])
[ はコマンド名なので、くっつけると別の名前のコマンドを探しにいきます。
if [$a = 1]; then ... -> [1: command not found
if [ $a = 1]; then ... -> [: missing `]'
if [ $a=2 ]; then ... -> 常に真になる(エラーは出ない)
3つ目は見落としやすいパターンです。 $a=2 はスペースが無いので「1=2 という1つの文字列」になり、[ 文字列 ] は「空でなければ真」なので、常に真になります。演算子の前後にも必ずスペースを入れます。
= と -eq の混同
= は文字列として、-eq は整数として比べます。 先頭に0が付いた値で違いがはっきり出ます。
v=010
[ "$v" = 10 ] && echo "str eq" || echo "str ne"
[ "$v" -eq 10 ] && echo "int eq" || echo "int ne"
(( v == 10 )) && echo "arith eq" || echo "arith ne (octal: $((v)))"
str ne
int eq
arith ne (octal: 8)
(( )) では 010 が8進数として解釈され8になります。 日付の 08 09 などを (( )) で扱うと ((: 08: value too great for base (error token is "08") というエラーになるので、(( 10#$v == 10 )) のように 10# を付けて10進数を指定します。
数字以外を -eq に渡したときのエラーも確認しました。
[ "abc" -eq 1 ] -> [: abc: integer expression expected
[ 1.5 -gt 1 ] -> [: 1.5: integer expression expected
空白を含むファイル名(binary operator expected)
f="my file.txt"
[ -e $f ] -> [: my: binary operator expected
[ -e "$f" ] -> 正しく判定
[ ] では変数を必ず "$f" とクォートする、これで空の変数と空白入りの値の両方に対応できます。
sh(dash)で [[ が使えない
Ubuntu や Debian では /bin/sh が dash を指しています。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 31 2024 /bin/sh -> dash
x=a
if [[ $x == a ]]; then echo yes; fi
if [ "$x" == a ]; then echo yes2; fi
$ dash d.sh
d.sh: 2: [[: not found
d.sh: 3: [: a: unexpected operator
sh script.sh で実行したり、1行目が #!/bin/sh だったりすると dash で動くため、[[ や == が使えません。 直し方は次の2つです。
| 方法 | 書き方 |
|---|---|
| bash で動かす | 1行目を #!/usr/bin/env bash にして bash script.sh か ./script.sh で実行 |
| POSIX の書き方にする | [[ ]] を [ ]、== を =、パターンマッチを case に置き換える |
エラー早見表
| エラー文 | 主な原因 | 直し方 |
|---|---|---|
unary operator expected |
空の変数をクォートしていない | "$var" とクォート、または [[ ]] |
integer expression expected |
整数でない値を -eq などに渡した |
${n:-0}、数値チェック、小数は awk |
binary operator expected |
空白入りの値をクォートしていない | "$var" とクォート |
too many arguments |
グロブ展開や単語分割で引数が増えた | クォート、パターンは [[ ]] か case |
[1: command not found |
[ の後ろのスペース忘れ |
[ $a = 1 ] |
missing `]' |
] の前のスペース忘れ |
[ $a = 1 ] |
[[: not found |
dash で実行している | bash で実行、または [ ] に書き換え |
unexpected operator |
dash で == を使った |
= に変える |
value too great for base |
08 09 を算術評価した |
10#$v |
if の代わりに && || と case を使い分ける
1行で済む処理は && ||、値で3つ以上に分けるなら case、それ以外は if が読みやすくなります。
for f in a.txt b.csv c.tar.gz d; do
case "$f" in
*.txt|*.md) echo "$f: text" ;;
*.csv) echo "$f: csv" ;;
*.tar.gz) echo "$f: archive" ;;
*) echo "$f: other" ;;
esac
done
a.txt: text
b.csv: csv
c.tar.gz: archive
d: other
| 書き方 | 向いている場面 | 例 |
|---|---|---|
if |
複数行の処理、else を含む分岐 |
設定ファイルの読み込み |
A && B |
A が成功したときだけ B | [[ -d $d ]] && cd "$d" |
A || B |
A が失敗したときだけ B | [[ -d $d ]] || mkdir -p "$d" |
case |
1つの値をパターンで多分岐 | 拡張子、サブコマンド、yes/no |
A && B || C は if-else と同じではありません。 B が失敗すると C も実行されます。
true && false || echo "fallback ran (A && B || C pitfall)"
fallback ran (A && B || C pitfall)
B が失敗する可能性があるときは if A; then B; else C; fi と書くと、意図どおりに動きます。
コピペ用テンプレート
引数チェック・ファイル確認・数値比較をまとめたテンプレートです。 set -euo pipefail と組み合わせても空変数で止まらないよう、${1:-} で既定値を入れています。
#!/usr/bin/env bash
set -euo pipefail
file="${1:-}"
if [[ -z $file ]]; then echo "usage: $0 FILE" >&2; exit 2; fi
if [[ ! -f $file ]]; then echo "not found: $file" >&2; exit 1; fi
if [[ ! -s $file ]]; then echo "empty: $file"; exit 0; fi
lines=$(wc -l < "$file")
if (( lines > 3 )); then echo "big: $lines lines"; else echo "small: $lines lines"; fi
実行結果(bash 5.2.21)です。
$ bash tmpl.sh; echo "exit=$?"
usage: tmpl.sh FILE
exit=2
$ bash tmpl.sh nofile; echo "exit=$?"
not found: nofile
exit=1
$ bash tmpl.sh empty.txt
empty: empty.txt
$ seq 5 > five.txt; bash tmpl.sh five.txt
big: 5 lines
sh(dash)でも動かしたい場合の書き換え表です。
| bash の書き方 | POSIX sh の書き方 |
|---|---|
[[ -z $file ]] |
[ -z "$file" ] |
[[ ! -f $file ]] |
[ ! -f "$file" ] |
(( lines > 3 )) |
[ "$lines" -gt 3 ] |
[[ $f == *.txt ]] |
case "$f" in *.txt) ... ;; esac |
[[ $s =~ ^[0-9]+$ ]] |
case "$s" in ''|*[!0-9]*) 偽 ;; *) 真 ;; esac |
[[ -v name ]] |
[ -n "${name+x}" ] |
set -o pipefail |
dash 0.5.12 では set: Illegal option -o pipefail(実行して確認) |
よくある質問
Q. [ ] と [[ ]] はどちらを使えばよいですか?
A. bash で動かす前提なら [[ ]] がおすすめです。クォート漏れによるエラーが起きにくく、&& やパターンマッチ、正規表現も使えます。/bin/sh で動かす必要があるスクリプト(コンテナの最小イメージや init スクリプトなど)では [ ] を使います。
Q. ファイルとディレクトリのどちらかが存在すればよいときは?
A. [[ -e $path ]] を使います。 -e は種類を問わず存在すれば真です。通常ファイルに限るなら -f、ディレクトリに限るなら -d を選びます。
Q. 文字列に特定の文字が含まれるか判定するには?
A. [[ $s == *文字列* ]] で部分一致を判定できます。 sh 互換なら case "$s" in *文字列*) ... ;; esac と書きます。大文字小文字を区別しないときは ${s,,} で小文字にしてから比べます。
Q. 小数を比較したいときはどうしますか?
A. [ ] も (( )) も整数専用なので、awk を使います。 awk -v v="$v" 'BEGIN{exit !(v > 1)}' の終了ステータスを if の条件に書けば、1.5 と 1 のような比較ができます。
まとめ
- if は条件の終了ステータス(0が真)で分岐する。
[ ]は test コマンド、[[ ]]は bash の構文、(( ))は整数の算術評価 - 文字列は
=/==、数値は-eq系か(( ))、存在確認は-e/-f/-dを目的で選ぶ [ ]では変数を必ずクォートする。空の変数でunary operator expected、空白入りでbinary operator expectedになる=~の右辺はクォートせず、正規表現は変数に入れる。グループはBASH_REMATCHで取り出せる[[ $f == *.txt ]]でパターンマッチができる。sh 互換ならcaseを使う- sh(dash)では
[[と==が使えないので、#!/usr/bin/env bashで bash を指定する A && B || Cは if-else とは別物。B が失敗しうるときは if で書く
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シェルスクリプトif条件式一覧|bash文字列比較・ファイル存在確認早見表」
株式会社RJCでは、シェルスクリプトの条件式のような毎日使う基礎を、仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。