私的AI研究会 > Shell覚書
$ vi hello.sh #!/bin/sh echo "Hello,World!!"
$ chmod u+x hello.sh
$ ./hello.sh Hello,World!!
#!/bin/sh echo Hello,World!!
$ vi sample.sh #!/bin/sh val1="Hello,World!!" val2=20 echo val1 echo "age:${val2}"
$ vi catn.sh #!/bin/sh cat -n $1
$ ./catn.sh sample.sh | $0 | | $1 |
特殊変数 意味 $0 シェルスクリプトの名前 $n n番目の引数 $* すべての引数リスト $# 与えられた引数の数 $? 直前に実行したコマンドの戻り値 $$ シェルスクリプトが実行された際のPID $LINENO この変数を記述した行番号
$ vi sample_if.sh #!/bin/sh if [ $1 = hello ] then echo arg is hello elif [ $1 = world ] then echo arg is world else echo arg is neither hello nor world fi
$ vi sample_test.sh #!/bin/sh if test -f $1; then echo File $1 exists fi
$ vi sample_case.sh #!/bin/sh case $1 in hello) echo hello ;; world) echo world ;; *) echo other ;; esac
オプション | 意味 |
-n string | 文字列の長さが0でないなら真 |
-z string | 文字列の長さが0なら真 |
string1 = string2 | 同一なら真 |
string1 != string2 | 同一でないなら真 |
オプション | 意味 |
num1 -eq num2 | 等しいなら真 |
num1 -ne num2 | 等しくないなら真 |
num1 -gt num2 | num1がnum2より大きいなら真 |
num1 -ge num2 | num1がnum2以上なら真 |
num1 -lt num2 | num1がnum2より小さいなら真 |
num1 -le num2 | num1がnum2以下なら真 |
オプション | 意味 |
-f file | fileが存在し、通常ファイルなら真 |
-c file | fileが存在し、キャラクタスペシャルファイルなら真 |
-e file | fileが存在すれば種類によらず真 |
-d file | fileが存在し、ディレクトリなら真 |
-L file | fileが存在し、シンボリックなら真 |
-r file | fileが存在し、読み取り可能なら真 |
-w file | fileが存在し、書き込み可能なら真 |
-x file | fileが存在し、実行可能なら真 |
オプション | 意味 |
expr1 -a expr2 | 2つの式の論理積をとる |
expr1 -o expr2 | 2つの式の論理和をとる |
!expr | 式の否定を返す |
$ vi sample_for.sh #!/bin/sh for str in hello world shell; do echo $str donefor 文は「for 変数名 in 文字列1 文字列2 .... ; do ~ done」と記述する
#!/bin/sh for number in `seq 1 3`; do echo "${number}" doneこのコードでは1,2,3とループされる
$ vi sample_while.sh #!/bin/sh max=40 a=1 b=1 while [ $b -le $max ]; do echo $b a=`expr $a + $b` b=`expr $a - $b` done
このシェルスクリプトでは変数 max 以下のフィボナッチ数列を計算している
このように回数がわからないがループ処理をしたいときには while 文が有効
#!/bin/sh func(){ echo $1 + $2 = `expr $1 + $2` } x=10 y=2 func $x $y「関数名(){ 処理 }」という形で関数は実現され、シェルスクリプトに引数を渡すように関数にも渡すことができる
ShellScript内で現在のディレクトリを移動したときの、終了時にディレクトリの位置
mycd.sh #!/bin/sh cd /path/terget
$ sh mycd.sh $ ./mycd.sh
$ source mycd.sh
vi md #!/usr/bin/env bash # 下ごしらえ .... # 実行 mdless "$@"
if文の演算子で「-e」を使うことでファイルが存在しているかどうかを確認することが出来る。
if [ -e ファイル ]; then 実行するコマンド fi
「! -e」とすることで、ファイルが存在しない場合に「真」となり、コマンドを実行させることが出来る。~
if [ ! -e ファイル ]; then 実行するコマンド fi
ディレクトリがあるかどうかを確認する場合は、「-d」を使用する。
if [ -d ディレクトリ ]; then 実行するコマンド fi
ディレクトリが存在していないことを確認させる場合は、演算子に「!」を付ける。
if [ ! -d ディレクトリ ]; then 実行するコマンド fi
ファイルやディレクトリの存在を確認する際に使用できる演算子一覧
演算子 | 説明 |
-a ファイル | ファイルがあれば真 |
-b ファイル | ファイルがありブロックス特殊ファイルであれば真 |
-c ファイル | ファイルがありキャラクター特殊ファイルであれば真 |
-d ファイル | ファイルがありディレクトリであれば真 |
-e ファイル | ファイルがあれば真 |
-f ファイル | ファイルがあり通常のファイルであれば真 |
-g ファイル | ファイルがありSGID(特殊なアクセス権)であれば真 |
-G ファイル | ファイルがあり実行グループIDによる所有者であれば真 |
-h ファイル | ファイルがありシンボリックであれば真(-Lと同じ) |
-k ファイル | ファイルがありステッキービットが設定されていれば真 |
-L ファイル | ファイルがありシンボリックであれば真(-hと同じ) |
-O ファイル | ファイルがあり実行ユーザIDによる所有者であれば真 |
-p ファイル | ファイルがあり名前付きパイプ(named pipe)であれば真 |
-r ファイル | ファイルがあり読み取り可能であれば真 |
-s ファイル | ファイルがありサイズが0より大きければ真 |
-S ファイル | ファイルがありソケットであれば真 |
-t FD | FD(ファイルディスクリプタ)が端末でオープンされていれば真 |
-u ファイル | ファイルがありSUID(特殊なアクセス権)であれば真 |
-w ファイル | ファイルがあり書き込み可能であれば真 |
-x ファイル | ファイルがあり実行可能であれば真 |