シェルスクリプトの文法
シェルスクリプトでは空行は無視される
code:script
いくら空行があってもOK!
echo "root directory"
cd /
ls -l
複数のコマンドの書きかた
echo "root directory";cd /;ls -l
セミコロンで区切ると複数のコマンドをワンライナーにできる
コマンドが長くなった時の改行
バックスラッシュをいれるとコマンドが長くなったときに途中で改行できる(シェルは1行として認識する)
code:改行
dhir \
ggo"
root dhir ggo
# パイプラインの後に入れても大丈夫
grep ho
drwxr-xr-x. 3 root root 21 Jun 1 2019 home
コメントアウトは#
変数の宣言はそのまま変数名=値、呼び出すときは$変数名
代入時に$を付けない(やりそう)
=の前後のスペースはNG
アルファベット、数字、_だけしか使えない
変数展開
code:変数展開
filename=foo.dat
echo ${filename}_backup
# $filename_backup は間違い
クォーティング
'とか"で文字列を囲むと、エスケープされる=メタ文字として認識されない
"test.txt" = test.txt という文字列として認識される
test.txt = test(何か1文字のワイルドカード)txt という文字列として認識される
ダブルクォート=$が変数展開される(これはPHPと同じ!)、コマンド置換が使える
シングルクォート=$は文字列として認識される
ダブルクォートのコマンド置換
code:コマンド置換
2020-03-12
# $()で囲んであるとコマンドの結果を文字列として代入できる(ダブルクォートの中でも有効)
Today is 2020-03-12
# バッククォートで囲んでもOK
Today is 2020-03-12
位置パラメータ
code:位置パラメータの使い方
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
echo "\$5 = $5"
# $0にはシェルスクリプト名、$1~は渡した引数が
$0 = ./parameters.sh
$1 = aaa
$2 = bbb
$3 = ccc
$4 =
$5 =
homesize.sh parameters.sh rootls.sh rootls2.sh test1.sh
$0 = ./parameters.sh
$1 = homesize.sh
$2 = parameters.sh
$3 = rootls.sh
$4 = rootls2.sh
$5 = test1.sh
引数の個数を表示する$#
code:$#
$0 = ./parameters.sh
$1 = aaa
$2 = bbb
$3 = ccc
$4 =
$5 =
$# = 3 # これが引数の数
# ファイルの中はこんな感じ
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
echo "\$5 = $5"
echo "\$# = $#"
引数全体の参照
code:@と*
echo "\$@ = $@"
echo "\$* = $*"
$@ = test tess hello
$* = test tess hello