Closed12

学習記録#23 250625

ろみぃ(konatsu)ろみぃ(konatsu)

スクリプトファイルに実行権を追加すると、ファイル名を指定するだけで、コマンドのように実行できるようになる

$ chmod a+x lsld ←これを実行すると、
$ ./lsld ←これでlsldの中身が実行される
ろみぃ(konatsu)ろみぃ(konatsu)

コマンドによって赤文字になったりならなかったりするのはなんだろうか

ろみぃ(konatsu)ろみぃ(konatsu)
  • bashコマンドの引数としてシェルスクリプトを実行する場合

  • 実行権のあるシェルスクリプトをファイル名の指定で実行した場合
    bashの子プロセス(サブシェル)が起動、つまり新しいbashが起動してスクリプトはそちらで実行される
    →このとき、元のbashは上記の実行が終了するまで待機している

  • sourceコマンドやコマンド
    →元のシェル上で実行される

ろみぃ(konatsu)ろみぃ(konatsu)

前者と後者でシェル変数の扱いが異なる。

後者だと、元のシェルで定義されたシェル変数をシェルスクリプト内で参照したり、書き換えたりできる

ろみぃ(konatsu)ろみぃ(konatsu)

シェルスクリプトにshiftコマンドを入れると、そのスクリプト内の変数が1つずつ後ろにずれる

$ cat shift.sh
echo "arg1: $1"
echo "arg2: $2"
shift
echo "arg1: $1"
echo "arg2: $2"
$ bash shift.sh 'abc' 'def'
arg1: abc
arg2: def
arg1: def
arg2:
ろみぃ(konatsu)ろみぃ(konatsu)

コマンドを実行すると、終了時にシェルに対して返り値を返す
正常終了:0
正常に終了しなかった:0以外

この値を終了ステータスという

ろみぃ(konatsu)ろみぃ(konatsu)

シェルスクリプトでは、最後に実行されたコマンドの終了ステータスが返り値になる

ろみぃ(konatsu)ろみぃ(konatsu)
$ cat reiji.sh
pwd ; ls ←左から順にコマンドを実行
ls haruki/grape && cat haruki/grape ←最初のコマンドに成功したら次のコマンドも実行する
cat minoru || echo "file not found" ←最初のコマンドを実行して、失敗していたら次のコマンドも実行する
$ bash reiji.sh
/theodore
dexitaken      file_list  haruki  log_test.log	ls_log	lslink	  sample.txt   sample1.txt.hard   sample1.txt.tar  sanemitsu  temple1.txt	temple2.sym.txt  temple3.txt  testargs	xab
dexitaken.tar  hajime	  isoi	  ls.log	lsld	reiji.sh  sample1.txt  sample1.txt.hard2  sample_sub.txt   shift.sh   temple2.hard.txt	temple2.txt	 temple4.txt  xaa	xac
haruki/grape
Haruki is grape.
cat: minoru: No such file or directory
file not found
ろみぃ(konatsu)ろみぃ(konatsu)

ファイルが存在するかどうかでスクリプトの動作を変えたりファイルに関する情報を取得する必要がある場合、testコマンドを使う

test [条件文]

条件文には式が入る。
式が真なら0、偽なら0以外の値が返される

このスクラップは3ヶ月前にクローズされました