読者です 読者をやめる 読者になる 読者になる

カメニッキ

カメとインコと釣りの人です

自分用シェルスクリプトおぼえがき

LinuxCommand

自分用 シェル書くときのおぼえがき

ちゃんと実行権限つける

vimで編集中のシェル叩く

# ノーマルモードで以下叩く
:!sh %

毎回↑めんどいからショートカットつける(おまけにrubyphpもいける。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
 ↑何につかうかわからん
$?:最後に行ったコマンドの戻り値 -> 00は正常終了、それ以外の数字はエラーか?
$$:現在のシェルの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