自分用シェルスクリプトおぼえがき
自分用 シェル書くときのおぼえがき
ちゃんと実行権限つける
vimで編集中のシェル叩く
# ノーマルモードで以下叩く :!sh %
毎回↑めんどいからショートカットつける(おまけにrubyとphpもいける。goだったらexecuteの中身はgo runとか)
function! ExecuteCurrentFile() if &filetype == 'php' || &filetype == 'ruby' || &filetype == 'sh' execute '!' . &filetype . ' %' endif endfunction nnoremap <Space> :call ExecuteCurrentFile()<CR>
一行コメント
先頭に「#」
複数行コメント
<<COMMENT1 ここは こめんと です COMMENT1
計算
# $(( 式 )) val=$(( 100 + 200 * 300 / 400 % 2 )) # べき乗 echo $(( val ** 3 )) # インクリメント前付けは計算前実行 echo $(( val++ )) echo $(( ++val )) # デクリメント echo $(( val-- )) echo $(( --val ))
シェルスクリプトの特殊変数
$ ./args.sh hoge fuga $0:スクリプト名 -> ./args.sh $1:ひとつめの引数 -> hoge $2:ふたつめの引数 -> fuga $#:与えられた引数の数 -> 2 $*:与えられた引数がぜんぶまとめてダブルクォーテーション囲み -> hoge fuga $@:与えられた引数が個別にダブルクォーテーション囲み -> hoge fuga ↑echoすると違いがわからん $-:シェルに与えられたフラグ -> hB ↑何につかうかわからん $?:最後に行ったコマンドの戻り値 -> 0 ↑0は正常終了、それ以外の数字はエラーか? $$:現在のシェルのPID -> 9949 $!:最後にバックグラウンドで行ったコマンドのPID ->
ユーザから入力受け付ける
# 入力された値は$hogeに入る read -p "input please:" hoge echo $hoge
変数
# =との間はスペースいれない hoge="fuga" # $つけてよむ echo $hoge -> fuga # ダブルクォーテーションの中だと展開 echo "$hoge" -> fuga # シングルクォーテーションの中は展開されない echo '$hoge' -> $hoge
比較冤罪
- -eq ・・・ 左と右が一致していたらTrue
- -ge ・・・ 左が右以上だったらTrue
- -gt ・・・ 左が右より大きかったらTrue
- -le ・・・ 右が左以上だったらTrue
- -lt ・・・ 右が左より大きかったらTrue
- -ne ・・・ 左と右が不一致ならTrue
- -f filename ・・・ filenameがファイルだったらTrue
- -d dirname ・・・ dirnameがディレクトリだったらTrue
- -e filename ・・・ filenameが存在したらTrue
- -r filename, -w filename, -x filname ・・・それぞれ読み取り・書き込み・実行がついていたらTrue
いずれもtestコマンドで使える
[ 1 -eq 2 ] [ 1 -gt 5 ] [ -f "/etc/hosts" ] [ -d "/root" ]
# if - else [ 1 -eq 2 ] && 条件式はFalseなので実行されない || 実行される [ 1 -eq 1 ] && 条件式がTrueなので実行される || 実行されない # 単品でもいける [ 1 -eq 2 ] || 実行される [ 1 -eq 1 ] || 実行されない [ 1 -eq 2 ] && 実行されない [ 1 -eq 1 ] && 実行される
if文
# 一番単純 if [ -e "/etc/hosts" ] then # trueのときの処理 fi # false時の処理もつける if [ -e "/etc/hosts" ] then # trueのとき else # falseのとき fi # false時にさらに条件 if [ -e "/etc/hosts" ] then # trueのとき elif [ 1 -eq 2 ] then # ふたつめの条件がTrueのとき else いずれも一致しないとき fi
case文
hoge="fuga" case $hoge in aaaa) echo "aaaaaaaaaaaaaaaa" ;; fuga) echo "ここがでます" ;; *) echo "でふぉ値" ;; esac
for文
# 1から999まで処理する for i in {1..999} do echo $(( $i ** 5 )) done # findで見つかったファイルを処理 for file in $(find ~/work) do echo $file done
while
i=1 while [ $i -gt 10 ] do echo "aaaaaaaaaaaaaaaaa" i=$(( i++ )) done
関数定義
hoge(){ echo "aaaaaaaaaaaaaaaa" echo "bbbbbbbbbbbbbbbb" } #呼び出し hoge