- 投稿日:
ifの書き方メモ。中身はtest
コマンドなので[[]]
の中はtest
と同じ書き方が可能。コマンドなので演算子の間とかはスペースが無いとうまく動かない。余談だがzshでwhich
すると組み込みコマンドであることが確認できる
which [[
zsh: bad pattern: [[
which [
[: shell built-in command
which test
test: shell built-in command
基本構文
あくまでコマンドなので演算子の間には半角スペースが必要。[
より[[
の方が高機能らしい
https://fumiyas.github.io/2013/12/15/test.sh-advent-calendar.html
https://yukidarake.hateblo.jp/entry/2015/12/14/205610
if-elif-else
if [[ $var = "条件" ]]; then
# 処理
elif [[ $var -eq 0 ]]; then
# 処理
else
# 処理
fi
and / or
[[]]
を&&
か||
で区切れば成立する。これらは演算をしているわけではなく[[
の終了コードを見て次のコマンドを実行するかどうかを判断しているだけ
if [[ $var1 = "条件1" ]] && [[ $var2 = "条件2" ]]; then
# 処理
fi
if [[ $var1 = "条件1" ]] || [[ $var2 = "条件2" ]];
# 処理
fi
動作機序
test
コマンドは条件を満たせば0
、満たさなければ1
を終了コードに設定するため、単純にこれを利用している。[[
で代替可能なため基本的にtest
は使わない方がいい
# 条件1の$?が0なら条件2が走る
[[ $var1 = "条件1" ]] && [[ $var2 = "条件2" ]]
# 条件1の$?を無視して条件2が走る
[[ $var1 = "条件1" ]] || [[ test $var2 = "条件2" ]]
オプション
文字列用
オプション | 意味 | 補足 |
---|---|---|
string = string | 等しい | - |
string != string | 等しくない | - |
string =~ string | 正規表現一致 | - |
-n string | 空文字でない | non-zero |
-z string | 空文字 | zero |
-d path | ディレクトリ | directory |
-s path | ファイルサイズが 0 を超える | size |
数値用
オプション | 意味 | 補足 |
---|---|---|
0 -eq 0 | 等しい | equals |
0 -ne 0 | 等しくない | not equals |
0 -lt 0 | 未満 | less than |
0 -le 0 | 以下 | less than or equal to |
0 -gt 0 | 超える | greater than |
0 -ge 0 | 以上 | greater than or equal to |
ファイル用
オプション | 意味 | 補足 |
---|---|---|
-d path | ディレクトリ | directory |
-e path | 存在するパス | exists |
-f path | ファイル | file |
参考
- https://ss64.com/bash/test.html
- ifの書き方全般の説明がある
- 投稿日:
配列をループして処理したい時に使える技。複数行ある場合も想定
一行文字列の配列
スペースで区切った文字列を()
で括っておくとfor in
として使える
取り出した要素は${foo}
で拾えます。配列全体は${bar[@]}
で取れる。以下のようにダブルクォートで囲っていると機能しなくなるので注意
("AAA BBB CCC")
#!/bin/bash
textList=(YWFhYWEK LWFhYQogICAtIOOBguOBguOBguOBgg== LWFhYQogICAtIOOBguOBguOBguOBgg==)
for text in "${textList[@]}"
do
echo ${text}
done
出力結果
YWFhYWEK
LWFhYQogICAtIOOBguOBguOBguOBgg==
LWFhYQogICAtIOOBguOBguOBguOBgg==
複数行文字列の配列
Base64辺りでエンコードしておくと扱いが楽
#!/bin/bash
textList=(YWFhYWEK LWFhYQogICAtIOOBguOBguOBguOBgg== LWFhYQogICAtIOOBguOBguOBguOBgg==)
for text in "${textList[@]}"
do
pure=$(echo ${text} | base64 -d)
echo "$pure"
done
出力結果
aaaaa
-aaa
- ああああ
-aaa
- ああああ
ls
の結果を配列にする
#!/bin/bash
# .と..は除外
# 最後にxargsを入れておくと改行が飛ぶ
results=($(ls -1a | grep -vP "^\.+$" | xargs))
for item in "${results[@]}"
do
echo "$item";
done
スペース区切りの文字を配列にする
IFS変数に区切り文字を設定することで実現する。IFSとはInternal Field Separatorのこと
#!/bin/bash
IFS=$'\n'
text=$(cat <<'EOF'
aa bb
a b c
EOF
)
textList=($(echo "$text"))
for text in "${textList[@]}"
do
echo "${text}"
done
出力結果
aa bb
a b c
- 投稿日:
置換をするためのコマンドだが、PCREは基本使えない(自前でビルドすれば使える)
大抵のケースでPerlを使った方が楽だが、Dockerなど、入っていない環境では重宝する
オプション
-l
入力からケツ改行を消す
CLI入力するとケツに改行が入るのでそれを除去できる-p
入力行を処理する-e
スクリプトを流せるphp -r
のようなもの-i[ext]
ファイル置換。extに指定があるとバックアップファイルが生えるsed -i.bak -e 's/aaa/bbb/' path/to/file