II=3
if [ $II -ge 1 ]; then echo "greater or equal" ; else echo less; fi
if [ $II -le 5 ]; then echo "less or equal" ; else echo greater; fi
if [ $II -eq 3 ]; then echo "equal" ; else echo "not equal"; fi
if [ $II -ne 0 ]; then echo "not equal" ; else echo equal; fi
SS=hoge
if [ $SS = "hoge" ] ; then echo "equal" ; else echo "not equal"; fi
if [ $SS != "fuga" ]; then echo "not equal"; else echo "equal"; fi
if [ -n $SS ] ; then echo "not empty"; else "empty"; fi
if [ -z "" ] ; then echo "empty" ; else "not empty"; fi
if [ -f /etc/hosts ] ; then echo "file exists" ; else echo "not file exists"; fi
if [ ! -f /etc/hoge ]; then echo "not file exists" ; else echo "file exists"; fi
if [ -d /etc ] ; then echo "directory exists" ; else echo "not directory exists"; fi
if [ ! -f /hoge ] ; then echo "not directory exists"; else echo "directory exists"; fi
if [ -e /etc/hosts ] ; then echo "exists" ; else echo "not exists"; fi
if [ ! -e /etc/hoge ]; then echo "not exists" ; else echo "exists"; fi
if [ -s /etc/hosts ] ; then echo "not empty file" ; else echo "empty file"; fi
HOGE=123 hoge.sh
として実行するスクリプトで、変数 HOGE が省略された場合のデフォルト値を設定する。
#!/bin/bash
HOGE=${HOGE:-111}
echo $HOGE
hoge.sh
と実行すると、111
が表示される。
date --date "next month last day" +%Y%m01
last day” +%Y%m%dtoday=`date +%Y%m%d.txt`
echo hoge > ${today}
now=`date +%Y%m%d%H%M%S.txt`
echo hoge > ${now}
I/Oリダイレクトして root 権限が必要にファイルに書き込む
ls -l > rootfile.txt
ls -l | sudo tee rootfile.txt
ls -l >> rootfile.txt
ls -l | sudo tee -a rootfile.txt
for f in *.txt; do ts=`stat -f %m $f`; dt=`date -r $ts +%Y%m%d-%H%M%S`; mv $f $dt.jpg; done
expr 3 "*" 5
echo $((3 * 5))
echo “3 * 5” | bc または bc コマンドを実行して、対話的に計算式を入力
if の括弧はを二重に囲む([[]])
正規表現文字列をダブルクォートで囲むことはできない
\s のような文字クラスは使えない
VAR="ABC123"
if [[ $VAR =~ ^([A-z]+)([0-9]+)$ ]]; then
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
fi
スペースを含む場合は、正規表現文字列を変数にセットしてマッチング処理ができる
タブ文字を入力する場合は control + V, control + I で入力
VAR="ABC 123"
REG="^([A-z]+)[ ]*([0-9]+)$"
if [[ $VAR =~ $REG ]]; then
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
fi
10 回繰り返す
for i in {1..10}
do
echo $i
done
または
for i in `seq 1 10`
do
echo $i
done
変数に格納された回数繰り返す
MAX=10
for i in `seq 1 $MAX`
do
echo $i
done
ファイルを 1行ずつ読み込んで処理する
while read line
do
echo $line
done < readme.txt
標準入力から 1行ずつ読み込んで処理する
ls -1 | while read line; do echo $line; done
変数にセットされた複数行のカンマで区切られた文字列を順に処理する
LIST="
# comment
abc,def,efg
# comment
123,456,789
"
while IFS= read -r line; do
# 空行を取り除く
[[ -z "$line" ]] && continue
# '#' で始まるコメント行を取り除く
[[ ${line} =~ ^#.* ]] && continue
# カンマで分割
IFS=',' read -r var1 var2 var3 <<< "$line"
echo "${var1}, ${var2}, ${var3}"
done <<< "${LIST}"
結果
abc, def, efg
123, 456, 789
ワンライナー(ループ内)でバッグラウンド実行する
for F in *.json; do hoge $F &; done
このようにセミコロン(;)の前に & があると「-bash: syntax error near unexpected token `;’」というエラーになる。
(解決策)
次のようにセミコロン(;)と & の間に何かコマンドを入れておく。
for F in *.json; do hoge $F & sleep 0; done
if [ `find /tmp/foo -name '*.txt' -type f | wc -l` -gt 0 ] ; then
# 処理
fi
for file in 20*; do mv $file `echo $file | sed -e "s/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1\.\2\.\3/"`; done
echoで実行内容を表示し、正しく変換できているのを確認してから実行すると良い。
for file in 20*; do echo `echo $file | sed -e "s/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1\.\2\.\3/"`; done
date –date '1 day ago'
yesterday=`date -d '1 day ago' +%Y%m%d`
for fname in *.doc; do mv $fname ${fname%.doc}.txt; done
(例) すべての JAR ファイルに署名
for jar in *.jar; do jarsigner -keystore /mnt/foo.key -storepass passs -keypass passk -signedjar sign/$jar $jar aliasname; done
HISTCONTROL=ignoredups
stty stop undef
export PS1="[\u@\h\D{ %FT%T} \W]\\$ "
正しくは
export PS1=”[\u@\h \D{%FT%T} \W]\$ “
⬆︎”{%” のエスケープがうまくいかないので ‘{‘ を 16進数で記述。