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