Table of Contents
Case 1: if
を用いるケース
if command syntax
1
2
3
if [[ expression ]]; then
command
fi
[[ expression ]]
の終了値が 0 であればcommand
が実行される- 終了値が 0 でなければ,
command
を実行することなくif文を終了
ファイルの存在判定は, -e
, -f
を用いますが以下のような違いがあります:
-e
: ファイルが存在すれば真-f
: ファイルが存在し, 通常ファイルならば真
従って, x.txt
というファイルが存在するかどうか調べたい場合は,
1
2
3
4
5
6
7
8
9
10
11
# fileが存在するときに処理を走らせたい場合
if [[ -f x.txt ]] ; then
echo file exists.
exit 0
fi
# fileが存在しないときに処理を走らせたい場合
if [[ ! -f x.txt ]] ; then
echo 'File "x.txt" is not there, aborting.'
exit 1
fi
なぜ二重に [[ expression ]]
で囲うのか?
bashにおける挙動上の差異
- 変数をダブルクォートで囲う必要性の有無
- escapeの必要性の有無
&&
,||
というand条件, of条件記号の利用可能性=~
によるregex matchingの利用可能性
基本的には, [[ ... ]]
を用いることが推奨されています.
1
2
3
4
5
6
# 変数をダブルクォートで囲う必要性の有無
file="file name"
[[ -f $file ]] && echo "$file is a regular file"
file="file name"
[ -f "$file" ] && echo "$file is a regular file"
複数条件を取り扱う際, 優先順番を明確にする ( ... )
は single square bracketだと, escapeする必要がありますが, 二重だとescapeする必要がなくなり, 書き方が以下のようにコンパクトになります.
1
2
3
4
# escapeの必要性とand/or条件
[[ -f $file1 && ( -d $dir1 || -d $dir2 ) ]]
[ -f "$file1" -a \( -d "$dir1" -o -d "$dir2" \) ]
また, regexを用いた文字列パターンマッチングも可能になるというメリットもあります.
1
2
# regex expresionの利用可能性
[[ $(date) =~ ^Fri\ ...\ 13 ]] && echo "It's Friday the 13th!"
個人的にsingle square bracketの一番イヤな点は, 比較処理の場合です.
x > y
: x is greater than or equal to yx \> y
: x is strictly greater than y
1
2
3
4
5
6
7
# 以下の場合は, condition passed が表示される
a=1
[ "$a" > 1 ] && echo "condition passed"
# 以下の場合は, condition passed が表示されない
a=1
[[ "$a" > 1 ]] && echo "condition passed"
Case 2: find
コマンドを用いるケース(推奨)
1
2
3
4
5
6
7
8
9
10
11
% tree -L 1 -a
.
├── bin # direcory
├── Desktop # direcory
├── Documents # direcory
├── Downloads # direcory
├── hexaly_setup # direcory
├── Music # direcory
├── .zshenv # file
├── .zshrc # file
└── .zshrc.backup # file
というカレントディレクトリ構成に対して, zsh
という文字列を含むファイルが存在するならば conditioned passed
がターミナル上に出力させたいとします.
1
2
3
4
5
6
7
$ find ./ -maxdepth 1 -name ".zsh*" -type f -exec bash -c "echo conditioned passed" {} +
conditioned passed
$ find ./ -maxdepth 1 -name ".zsh*" -type f -exec bash -c "echo conditioned passed" {} \;
conditioned passed
conditioned passed
conditioned passed
find
コマンドの-exec bash -c
はfind
で見つけたファイル or direcotryに対して実行するスクリプトを指定{}
は,find
コマンドで見つけたオブジェクトの引数で呼ぶ際の位置\;
,+
の差分は, 前者が逐次実行, 後者は検索結果をすべて一括の一つのスクリプトで同時に処理する場合に用いる
References
- What is the difference between
test
,[
and[[
? - stackoverflow > How to exit a shell script if targeted file doesn’t exist?
- Ryo’s Tech Blog > find & rename files & mv: 条件にあったファイルをmvし一つのディレクトリに集約する
統計
Python
math
Linux
Ubuntu 20.04 LTS
Shell
English
git
方法論
Ubuntu 22.04 LTS
統計検定
競技プログラミング
フーリエ解析
前処理
SQL
coding
コミュニケーション
Network
ssh
将棋
Data visualization
Docker
Econometrics
VSCode
statistical inference
GitHub Pages
apt
development
システム管理
Coffee
cloud
数値計算
素数
Book
Font
Metrics
Poetry
Ubuntu 24.04 LTS
architecture
aws
shell
systemctl
テンプレート
データ構造
ポワソン分布
会計分析
文字コード
環境構築
論文
App
Bayesian
Dynamic Programming
Keyboard
Processing
R
Steam
filesystem
quarto
regex
(注意:GitHub Accountが必要となります)