bash でよく使うやつ
桁指定で表示する
-bash ~$ i=1 -bash ~$ printf "%02d" $i 01-bash ~$
改行させるなら
-bash ~$ printf "%02d\n" $i 01
整数の加算
expr とさらばできる
-bash ~$ i=0 -bash ~$ ((i++)) -bash ~$ echo $i 1
C 言語っぽい for 文がかける
$ for (( i=0; i<3; i++)) do echo $i; done 0 1 2
正規表現でマッチングできる
in 句のように使える
-bash ~$ a=abc -bash ~$ [[ $a =~ c ]] && echo "matched" matched -bash ~$ [[ $a =~ d ]] && echo "matched" -bash ~$
リスト
# リストの作成 -bash ~$ i=("a" "b" "c") # リストの展開 -bash ~$ echo ${i[0]} a -bash ~$ echo ${i[1]} b -bash ~$ echo ${i[2]} c -bash ~$ echo ${i[@]} a b c -bash ~$ echo ${i[*]} a b c # 要素の数 -bash ~$ echo ${#i[@]} 3 # 要素の追加 -bash ~$ i+=("d") -bash ~$ echo ${i[@]} a b c d -bash ~$ echo ${#i[@]} 4
引数を順番に処理する
$ cat shift_test.sh #!/bin/bash echo $1 echo $# shift echo $1 echo $# $ sh shift_test.sh 1 2 1 2 2 1
引数がなくなるまでループする
$ cat shift_test.sh #!/bin/bash for (( i=0; $#>0; )) do echo $1 shift done echo "exit" && exit 0 $ sh shift_test.sh 1 2 3 4 5 1 2 3 4 5 exit
i=0
がないと shift_test.sh: line 3: syntax error: arithmetic expression required
と怒られる
ユーザからの入力があるまでスクリプト実行を待機する
$ cat shift_test.sh #!/bin/bash for (( i=0; $#>0; )) do echo $1 shift if [ $# = 1 ]; then read -p "this is last loop. hit enter key to continue." fi done echo "exit" && exit 0 $ sh shift_test.sh 1 2 3 4 5 1 2 3 4 this is last loop. hit enter key to continue. 5 exit
中断するときは ctrl + c
関数名を表示する
$ cat func_test.sh #!/bin/bash function mytest() { echo ${FUNCNAME} } mytest $ sh func_test.sh mytest
printf で文字列を置換する
$ a=test $ printf '%s\n' $a test
ファイルの行番号を表示する
以下の様な txt を用意して、
$ cat raw.txt nikko nikko ni- anata no heart ni niko niko ni- egao todokeru yazawa niko niko- nikoni- tte yonde love niko
while ループでまわす
$ cat raw.txt | while read line; do printf '%2d %s\n' ${lineno} "${line}"; (( lineno++ )) ; done 1 nikko nikko ni- 2 anata no heart ni 3 niko niko ni- 4 egao todokeru 5 yazawa niko niko- 6 nikoni- tte yonde 7 love niko
実行中のファイルの行番号を表示する
$ cat raw.sh #!/bin/bash echo ${LINENO} echo ${LINENO} echo ${LINENO} echo ${LINENO} function mytest() { echo ${FUNCNAME} ${LINENO} } echo ${LINENO} echo ${LINENO} mytest echo ${LINENO} echo ${LINENO} $ sh raw.sh 3 4 5 6 13 14 mytest 10 18 19