Closed12
学習記録#23 250625

523ページから

532ページまで

スクリプトファイルに実行権を追加すると、ファイル名を指定するだけで、コマンドのように実行できるようになる
$ chmod a+x lsld ←これを実行すると、
$ ./lsld ←これでlsldの中身が実行される

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

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

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

シェルスクリプトに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:

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

Dockerのログとかで見るexited 0
とかexited 1
のやつはこれだ

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

$ 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

ファイルが存在するかどうかでスクリプトの動作を変えたりファイルに関する情報を取得する必要がある場合、testコマンドを使う
test [条件文]
条件文には式が入る。
式が真なら0、偽なら0以外の値が返される
このスクラップは3ヶ月前にクローズされました