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