シェルスクリプトとコマンド引数

シェルスクリプトとコマンド引数
#15 コマンド引数を使ってみよう
http://dotinstall.com/lessons/basic_shellscript/10615
を参考に、
コマンドラインからわたした引数について学習
複数のファイルになんらかの実行をするときに使う
$0
プログラム自身
以降 $9 までがプログラムの引数になり
10以降については
${10} というように {} で数値を囲む必要があるので注意
$@
引数全部
$#
引数の個数
これだけだとわかりにくいので
例を作ってみた
vim arg.sh でファイルを作成して
#!/bin/bash
echo $0
echo $1
echo $2
echo $@
echo $#
で保存して、
chmod +x arg.sh
で権限付与
実行する時に
./arg.sh exitst this world
というように、適当に単語をスペースで区切って書いて実行
このスペースで区切ったのが引数となる
./arg.sh
exitst
this
exitst this world
3
が実行結果
それぞれをスクリプトの引数に照らし合わせると
./arg.sh == $0 プログラム名
exitst == $1
this ==$2
exitst this world ==$@ 引数全部
3 == $# 引数の数
つまり
exitst this world
の部分が引数扱いになる

シェルスクリプトの for 文

シェルスクリプトの for 文
#14 for文でループ処理をしてみよう
http://dotinstall.com/lessons/basic_shellscript/10614
を参考に
シェルスクリプトでの for 文を学習
構文は
for 変数 in 配列
do
行う処理
done
となる
例えば、1から5まで表示するなら
for i in 1 2 3 4 5
do
echo $i
done
となる
とはいっても、通常はこのようにわざわざ全部
書くようなことはせず、配列にまとめるので
a=(1 2 3 4 5)
for i in ${a[@]}
do
echo $i
done
というようにする
a[@] というのは
a配列の中身全部という意味
変数で配列を指定するときには
${} で囲むことを忘れずに
今回なら${a[@]}となる
また、今回の様に1~5というのを全部書くのではなく
seq を使うことで
1~100というような指定ができる
for で指定するときには
バッククオートで囲んで範囲指定する
構文にすると
for 変数 in `seq 始まりの数 終わりの数`
となる
例えば25~30としたいのなら
for i in `seq 25 30`
というように指定する
バッククオートのかき方は
shift + @ で ` となる
shuft + 7 の’と間違えやすいので注意

シェルスクリプトでの while文

シェルスクリプトでの while文
#13 while文でループ処理をしてみよう
http://dotinstall.com/lessons/basic_shellscript/10613
を参考にシェルスクリプトでの while文について学習
構文は
while [ 条件式 ]
do
行う処理
done
となる
条件式のところの [ ] は
以前やった if の条件式と同じで
[ は test コマンドの代わりにしているので
前後に空白を開けること
i=0;
while [ $i -lt 10 ]
do
i=`expr $i + 1`
echo $i
done
とすると
1から10まで表示される
$i -lt 10

$i < 10 という意味 -ltはより小さいと言う意味で < と同じ あと、注意点として i=`expr $i + 1` の` はバッククオートなので shift + @ で打つ shift + 7 の ' ではないので注意 expr は数値計算するときに使うコマンド あと、シェルスクリプトで 無限ループを作成したいのなら while : とする : はNULLコマンドなので いつでも正常終了、つまり0になる while ループの条件がずっと 0になるので無限ループになる これを抜けるには 一時的に抜けたいのなら continue 完全にループを抜けるのなら break となる これらは while : の無限ループの中で 特定条件を if で指定し 条件を満たしたときに処理したり ループを抜けるように使われる

シェルスクリプトでの case 文

シェルスクリプトでの case 文
#12 case文で条件分岐をしてみよう
http://dotinstall.com/lessons/basic_shellscript/10612
を参考に
シェルスクリプトでの case 文を学習
java script とかPHPなどでは
switch(条件){
case 1:
case1 のときに行う処理;
break;
case 2:
case2 のときの行う処理;
break;
default:
その他の時の処理;
break;
}
となる
しかし
シェルスクリプトの場合
if のときと同じで
caseの範囲を
{} でスコープすることがない
シェルスクリプトでの case 文を
構文にすると
case 条件 in
条件1)
条件1だったときの処理
;;
条件2)
条件2のときの処理
;;
*)
どれも当てはまらない時の処理
defalult 処理と同じ意味
;;
esac
;;は break と同じ意味になる
条件2)

case 条件2 :
と同じ意味
*)

default :
と同じ意味
シェルスクリプトでは if の範囲の終わりが
fi というように if を反対に記述したように
case の範囲の終わりも
esac というように case を反対に記述する
Javascript とかPHPから始めて
シェルスクリプトをやりはじめると
最初に if とか case などでわかりにくいけど
パターンを置き換えて覚えると覚えやすい
== の代わりに -eq
!= の代わりに -ne
などなど

シェルスクリプトでの if else 文

シェルスクリプトでの if else 文
シェルスクリプトでは
if文は
if [ 条件 ]; then
行う処理
fi
というかき方をする
if else の場合だと
if [ 条件 ]; then
条件を満たすときの処理
else if [ 条件を満たさないときに行う次の条件 ]; then
この条件を満たした場合の処理
else
どちらでもなかった場合の処理
fi
というようになる
例えば、
x=10
if [ $x -ge 60 ]; then
#60 以上なら
echo “ok”
else if [ $x -ge 20 ] ; then
#20 以上なら
echo “warning”
else
#20よりも下なら
echo “danger ”
fi
というようになる
[ ] は test の代わりなので
前後にスペースを開けるようにすることを忘れずに
Java Script とかでよくある if else とほぼおなじだけど
かき方が微妙に違う
条件式で < とか > などではなく
-eq などを使う
比較している条件の意味は
-eq
等しいか調べる
== と同じ
-ne
等しくない
!= とおなじ
-gt
~より大きい
< とおなじ -ge ~以上 <= と同じ -lt ~より小さい >とおなじ
-le
~以下
>= と同じ

シェルスクリプトで if 文

シェルスクリプトで if 文
シェルスクリプトのif 文について
#10 if文で条件分岐をしてみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10610
を参考に学習
PHP JavaScript などと違い
if(){}
というかきかたをシェルスクリプトではしない
構文は
if [ 条件 ] ;
then
行う処理
fi
というかき方をする
スコープがないため
fi で if のスコープの終わりを意味するようになる
[ ] は test コマンドの代わり
このため [ ] の前後には
スペースを開けること
つまり
x=70
if test $x -gt 60
then
echo “OK”
fi

x=70
if [ $x -gt 60 ]
then
echo “OK”
fi
は同じ
ちなみに、
-gt はより大きいという意味

文字列、ファイル、論理演算子を使った条件式

文字列、ファイル、論理演算子を使った条件式
#09 条件式を評価してみよう (2)
http://dotinstall.com/lessons/basic_shellscript/10609
を参考に
文字列、ファイル、論理演算子を使った条件式
を学習
数値での比較の場合は
-eq とか -ne
文字列の場合は
= で等しい
!= で等しくない
というように、java script などのプログラムと変わらない
次にファイルの比較
-nt
2つのファイルを比較して、どちらが新しいか比較する
-ot
2つのファイルを比較して、どちらが古いか比較する
-e
ファイルが存在するか
-d
ディレクトリなのか判定
ということで、ファイルが存在しているか調べるには
test -e ファイル名 ; echo $?
とすれば、ファイルが存在するなら0
そうでないなら1が返ってくる
例えば
test -e hello.sh ; echo $?
echo $? で0か1を表示している
そして、これらを組み合わせる論理演算しも
シェルスクリプトに存在する
-a
AND
-o
OR
!
NOT
となる
これらを使った例として
1と1が等しく、かつ 2と2 がひとしい
これを書くと
test 1 -eq 1 -a 2 -eq 2 ; echo $?
となる
これは
(1 ==1)&&(2==2)
と同じ意味になる
結果は正常終了なので

になる

シェルスクリプトの条件式

シェルスクリプトの条件式
#08 条件式を評価してみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10608
を参考に
シェルスクリプトの条件式について学習
Linux では正常終了したかどうか評価することがおおい
正常終了は0になるので
0であるかどうか調べたり、比較したりすることになる
評価するコマンドは
test コマンド
これについては
【 test 】 条件式の真偽を判定する
も参考に
例えば、数値評価で
1と2が等しいか評価するには
test 1 -eq 2 ; echo $?
とする
-eq は等しいか?
という意味の条件式
$? は
直前に行った命令が正常終了したかどうか返す
正常終了なら0
そうでないなら1
となる
test 1 -eq 2 ; echo $?
は等しくないので

となる
test 1 -eq 1 ; echo $?
なら等しいので

となる
比較している条件の意味は
-eq
等しいか調べる
== と同じ
-ne
等しくない
!= とおなじ
-gt
~より大きい
< とおなじ -ge ~以上 <= と同じ -lt ~より小さい >とおなじ
-le
~以下
>= と同じ
これらの条件式を使うことで
if
while
case
for
などの処理ができる

コマンドの結果を配列として扱うには

コマンドの結果を配列として扱うには
#07 配列を使ってみよう (2)
http://dotinstall.com/lessons/basic_shellscript/10607
を参考に
配列要素の操作と
コマンドの実行結果を配列で扱う方法を学習
a=(2 4 6)

プログラム中で
6ではなく10に修正するには
a[2]=10
でOK
代入するときには
$a とはせず、そのままa[2] だけでOK
これで
echo ${a[@]}
で表示すると
2 4 6
から
2 4 10
へ変更されている
変更はこれでOKなので
次に要素の追加
これは
+=
で追加していく
a+=(20 30)
として
echo ${a[@]}
で表示すると
2 4 10 20 30
というように、最後のほうへ追加されているのがわかる
そして、次にコマンドの実行結果を配列として扱う方法
まず、変数に date の結果を代入
“ で囲むことで、date の実行結果が返ってくるので
これを変数に格納する
ちなみに、date の結果はスペースで区切られる
d=(`date`)
これを表示するには
echo ${d[3]}
とする
通常、date を実行すると
2013年 6月 5日 水曜日 21:01:36 JST
これを配列3、つまり
スペースで区切った4番目になるので
水曜日
と表示される

シェルスクリプトでの配列

シェルスクリプトでの配列
#06 配列を使ってみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10606
を参考に
シェルスクリプトでの配列で
各要素へのアクセスについて学習
まず
a=(2 4 6)
で配列作成
java script とか PHP のときとは違って
, で区切らず、スペースなので注意
これに
echo $a
とすると、先頭要素つまり2になる
もし、2番目の4を出したいのなら
echo ${a[1]}
というようにする
配列は
シェルスクリプトの場合でも
Java script の場合でも同じで
0から数える
このため、2番目は1となる
配列の数字をつけるときには
{} で変数を囲むのを忘れずに
つけずに
echo $a[1]
とすると
2[1]
と表示される
番号で指定するのではなく、
すべての要素を対象にするなら
@を使う
echo ${a[@]}
とすれば
2,4,6 が表示される
要素の数を取得したいのなら
echo ${#a[@]}
とすると
3つ格納されているので

と表示される