私的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とループされる
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「関数名(){ 処理 }」という形で関数は実現され、シェルスクリプトに引数を渡すように関数にも渡すことができる