Bash書くための雑なメモ
Posted on October 10, 2015 at 19:02 (JST)
半年ぶりのエントリーはただの忘備録です。
お約束
shebang
#!/bin/bash
変数の宣言・代入
変数のルール
- 英数字とアンスコで構成される
- 数字では始められない
- 大文字/小文字は区別される
VAR=hogehoge
※ = の両端にスペースを入れてはならない!
リスト
半角スペースかtabで区切った文字列は使う場所により配列扱いになる。
ヒアドキュメント
cat <<- EOF
Options:
-?,-h : this help
-v : show version and exit
EOF
制御文
if文
if condition_1
then
commands_1
elif condition_2
then
commands_2
else
command_3
fi
conditionは test コマンドを用いるか、[]を用いる。
if test $1 -le 0
if [ $1 -le 0 ]
コマンドの実行結果(正常:0, 異常:0以外)で分岐する
if diff $1 $2 > /dev/null #出力結果は不要
then
echo 'has no diff'
else
echo 'has diff'
fi
Tips: commandの後に $? を実行すると終了コードが確認できる
for文
VAR_LIST="item1 item2 item3" #スペースかタブ区切りでワードリストと判定される
for VAR in $VAR_LIST
do
echo $VAR
done
while文
while condition
do
command
done
case文
case $1 in
hoge | foo ) echo 'hoge or foo' ;;
[!A-Z]*) echo 'not A-Z' ;;
???) echo '3文字の文字列' ;;
*"?") echo '末尾が?' ;;
*) echo 'other' ;;
esac
select文
#!/bin/bash
select i in ll pwd date
do
case $i in
ll) ls -l ;;
pwd) pwd ;;
date) echo `date` ;;
*) echo "No such number <$REPLY>." ;;
esacss
done
testコマンド
expr | Javaっぽくいうと |
---|---|
num1 -lt num2 | num1 < num2 |
num1 -le num2 | num1 <= num2 |
num1 -gt num2 | num1 > num2 |
num1 -ge num2 | num1 >= num2 |
num1 -eq num2 | num1 == num2 |
num1 -ne num2 | num1 != num2 |
str1 = str2 | str1.equals(str2) |
str1 != str2 | ! str1.equals(str2) |
str1 | ! isEmpty(str1) |
-n str1 | ! isEmpty(str1) |
-z str1 | isEmpty(str1) |
expr1 -a expr2 | expr1 && expr2 |
expr1 -o expr2 | expr1 || expr2 |
!expr1 | ! (expr1) |
(expr1 -o expr2) -a expr3 | (expr1 || expr2) && expr3 |
その他
prinfコマンドで整形
printf "%5d: %s\n" 123 hogehoge
変数の展開
# 変数に値が入っていない場合に値を返す(代入はしない)
${var:-word}
# 変数に値が入っていない場合に値を代入する
${var:=word}
# 変数に値が入っていない場合にメッセージを出力し終了する
${var:?word}
# 変数に値が入っている場合に値を返す(代入はしない)
${var:+word}
# substring: length指定しない場合は末尾まで
${var:offset}
${var:offset:length}
# prefixで始まる変数名をすべて表示する
${!prefix*}
# 変数に代入されている値の文字数を表示
${#var}
# 代入されている値の文字列から前方一致した部分を削除する
${var#expression} # 最短一致
${var##expression} # 最長一致
# 代入されている値の文字列から後方一致した部分を削除する
${var%expression} # 最短一致
${var%%expression} # 最長一致
# 代入されている値の文字列を置き換える
${var/pattern/str} # 最初に一致したもののみ
${var//pattern/str} # 一致したもの全て
位置パラメータ
$ ./sample.sh "hello world" "I love coffee"
[$*][$@]は同じ挙動 → 位置パラメータは5つ(単語)
["$"]は全文が1つの位置パラメータと解釈される
=> <hello world I love coffee>
["$@"]はダブルクォートで囲まれた単位で位置パラメータに設定される
=> <hello world> <I love coffee>
以上です。