はじめに
LPIC Lv.1はじめました。
改めてシェルスクリプトを一から見直しているので
メモ残す。
引数を表す変数
変数名 | 説明 |
---|---|
$0 | シェルスクリプト名 |
$1 | 1番目の引数 |
$2 | 2番目の引数 |
$# | 引数の数 |
$@ | すべての引数(スペース区切り) |
$* | すべての引数(区切りは環境IFSで指定されたもの) |
確認のためのスクリプトと結果がコチラ
# cat testargs
echo $0
echo $1
echo $2
echo $#
# ./testargs arg1 hoge hage
./testargs
arg1
hoge
3
$0はシェルスクリプト名というよりかはシェルプロンプトから見た最初の引数って理解するとスッと入ってくる。なるほどねぇ~。
testコマンド
シェルスクリプトでif文使うときにおなじみの[ ]は実はtestコマンドでも同じことできる。
多分testを直感的に扱えるようにしたのが [ ]なのかなと。
…なので、↓↓の2つのスクリプトは同じ処理内容を意味する。
どっちを使うかはお好みで。
if test -f testscript
then
source ./testscript
else
echo "testscript file not exist"
fi
if [ -f testscript ]
then
./testscript
else
echo "testscript file not exist"
fi
行数縮めてこんな書き方にしても大丈夫。結構融通利く。
if [ -f testscript ] ; then
. ./testscirpt
else echo "testscript file not exist"
fi
本とかで調べると-fとか-dとか-eqとかいろいろあるけど、
ここでは「[]とtestは同じなんだ、へぇ~」くらいにとどめておく。
case文について
switch文ではなく、case文。論より証拠でやってみる。
# cat casetest.sh
case $1 in
1) echo "January" ;;
2) echo "February" ;;
esac
↓↓実行結果はコチラ↓↓
# bash casetest.sh 1
January
# bash casetest.sh 2
February
# bash casetest.sh 3
# bash casetest.sh 0
1,2のときだけ返事する、該当する値が無いときは値を返さない。わかりやすい。
ちなみにcase文は結構インデント気にしてないのか↓↓みたいな文を書いても余裕。
# cat casetest.sh
case $1 in
1) echo "January" ;;
2) echo "February" ;;
esac
# cat casetest.sh
case $1 in
1) echo "January" ;;
2) echo "February" ;;
esac
シェルスクリプトって結構タフですね。。。
for文
スペース区切りにしてしまえば配列から値を取り出すように回せるのか。
これはワイルドですねぇ。
```:cat fortest.sh
for var in Vine SUSE Gentoo
do
echo $var Linux
done
bash fortest.sh
Vine Linux
SUSE Linux
Gentoo Linux
```
連続する数値を回したいならseqを使ったらよいようだ。
# cat seqtest.sh
for i in `seq 10 15`
echo $i
done
# bash seqtest.sh
10
11
12
13
14
15
while文
whileは[]の条件が真の間中ってことね。OKOK。
i=1
while[ $i -le 10 ]
do
echo $i
let i=i+1 # ←letコマンドは算術式を評価するコマンド
done
read文
標準入力からの受付に使える。これは便利ですね。
# cat readtest.sh
echo -n "Who are you?"
read username
echo "Hello,$username san."
# bash readtest.sh
Who are you?hiroshi
Hello,hiroshi san.
このread文、より実践的な扱い方として
while read lineパターンというやり方があって
ファイルやヒアドキュメントを利用して、繰り返し入力を受け付ける、
なんてやり方ができるそうだ。
[参考:シェルスクリプトで一行ずつ読込む while read line 4パターン](https://server.etutsplus.com/sh-while-read-line-4pattern/}
# bash userBulkTest.sh nameList.txt
Hello, hiroshi san
Hello, peroshi san
Hello, poroshi san
Hello, waroshi san
# cat userBulkTest.sh
while read USERNAME
do
echo "Hello, $USERNAME san"
done < $1
# bash userBulkTest.sh nameList.txt
Hello, hiroshi san
Hello, peroshi san
Hello, poroshi san
Hello, waroshi san
おわりに
LPIC Lv.1の内容だけあって、シェルスクリプトもさらっと文法をなめた感じで終わった。
実際に使用されているようなシェルスクリプトをかけるようになるにはもっと深い知識がいるとは思うけど
一通りの文法は見渡すことができたので、改めて.bashrcとか、わかってるようでわかってない
身近なスクリプトを読むのが楽しくなりそうな気がしてきた。
~おしまい~