シェルスクリプトでのユーザ関数
#18 関数を使ってみよう
http://dotinstall.com/lessons/basic_shellscript/10618
を参考に
シェルスクリプトでのユーザ関数について学習
シェルスクリプトでのユーザ関数の作成は
function 関数名(){
行いたい処理
}
そして呼び出すときには
関数名
だけでOK
もし
function hello(){
#行いたい処理
}
なら
関数呼び出しは
hello
となる
実際にやってみると
vim myfunc.sh
内容は
#!/bin/bash
function hello(){
echo “hello shell script”
}
hello
として保存
chmod +x myfunc.sh
,/myfunc.sh
とすると
hello shell script
と表示される
ちなみに、
function は省略可能
シェルスクリプトでの関数の引数は
コマンドと同じように $1 $2 というように引数の数に$をつけて指定する
そして、引数を指定するときには
ユーザ関数の横にスペースで区切って
引数を記述する
例えば
!/bin/bash
function hello(){
echo “friends name $1 $2”
}
hello Mike Tom
これを実行すると
friends name Mike Tom
となる
そして、他のプログラム言語とちがうのが
変数の有効範囲
PHP Java Script C++ などでは
基本的に関数のスコープのそとにかいたものが
グローバル変数
スコープの中に書いたものがローカル変数となる
しかし、シェルスクリプトの場合
ローカル変数であると宣言する
local を変数の前につけないと
グローバル変数扱いになるので注意
まず、local なしの場合
#!/bin/bash
function hello(){
echo “hello shell script”
echo “friends name $1 $2”
i=5
echo $i
}
hello Mike Tom
echo $i
これだと、実行すると
hello shell script
friends name Mike Tom
5
5
となり、$i に関数の外からアクセスできているので
表示されている
次は、local 宣言した場合
#!/bin/bash
function hello(){
echo “hello shell script”
echo “friends name $1 $2”
local i=5
echo $i
}
hello Mike Tom
echo $i
これで実行すると
hello shell script
friends name Mike Tom
5
となり、関数の外からアクセスできなくなっているのが
わかる
ちょっとした違いに見えるけど
間違えると予期せぬ動きに悩まされるので注意
カテゴリー: シェルスクリプト
シェルスクリプトでファイルからデータ入力
シェルスクリプトでファイルからデータ入力
#17 ファイルから入力してみよう
http://dotinstall.com/lessons/basic_shellscript/10617
を参考に
ファイルからのデータ入力処理について学習
ユーザ入力でデータ入力するには
read を使う
ファイルから1行ずつ読み込んで実行するには
まず、
vim data.txt
でファイルを作成
内容は適当に
a
aaa
aaaaa
として保存
これを読み込んで表示するスクリプトを作成
vim filerun.sh
として
#!/bin/bash
i=1
while read line
do
echo “$i: $line”
i=`expr $i + 1`
done <$1
として保存し、実行する
$1 は引数1という意味なので
./filerun.sh data.txt
というように、読み込むファイルを指定する
すると
1: a
2: aaa
3: aaaaa
という結果になる
処理についてちょっと復習メモ
echo "$i: $line"
は、
$i=行数:$line=ファイルの内容
というようになる
i=`expr $i + 1`
これは行数の足し算
`` はバッククオートなので shift + @ なので
シングルクオート shift +7 と間違えないように注意
expr は計算するコマンド
while ループのなかで $i +1 なので
ファイルが読み込み終わるまで足されていく
while read line
のところは
構文にすると
while read 変数
do
行う処理
done < 読み込むファイル
となる
変数なので
while read thisfile
とかみたいに line じゃなくてもOK
あと、読み込むファイルは
今回は $1 としているけど
done < data.txt
としてしまえば、ファイルを直接読み込ませることもできる
これについては
while 文の使用方法
を参照するとわかりやすい
スクリプトでユーザ入力の受け付け
スクリプトでユーザ入力の受け付け
#16 ユーザーからの入力を受け付けよう
http://dotinstall.com/lessons/basic_shellscript/10616
を参考に、スクリプトでのユーザ入力の受け付けを学習
これにより、スクリプト実行中に
文字入力が可能になる
これには
read
を使う
動画を参考に実践
vim readtest.sh として
中身を
#!/bin/bash
while :
do
echo “文字を入力してください(終わりたいのなら end を入力)”
read key
echo “you pressed $key”
if [ $key = “end” ];then
break
fi
done
として保存
read の前に echo で文字を書いたのは
終わり方を示すのと
read だけだと何も表示されないので
わかりにくいから
while :
なので、無限ループ
終わるためには
if [ $key = “end” ];then
break
fi
の if 文にあるように $key = end となる
つまり end を入力したら終わり
ループ脱出には break を使う
case だと break は ;; だけど
while の場合ならbreak でOK
chmod +x readterst.sh
./readtest.sh
で実行すると
文字を入力してください(終わりたいのなら end を入力)
start
you pressed start
文字を入力してください(終わりたいのなら end を入力)
next
you pressed next
文字を入力してください(終わりたいのなら end を入力)
end
you pressed end
となる
ユーザ入力により処理分岐というのに使える
とくに case 文とか
また、選択肢でえらばせるには
select を使う
select option in CODE DIE
do
echo “you pressed $option”
break;
done
を追加する
構文は
select 変数 in 選択肢1 選択肢2
do
処理内容
break;
done
となる
オプションをつけて実行すると
文字を入力してください(終わりたいのなら end を入力)
true
you pressed true
文字を入力してください(終わりたいのなら end を入力)
end
you pressed end
1) CODE
2) DIE
#? 3
you pressed
というようになる
オプションをつけた場合、
1) CODE
2) DIE
というように表示される
本来は、なんらかの処理をするけど
今回は
break
となっているので、どの数字、1、2以外でも
入力すると終了するようになる
シェルスクリプトとコマンド引数
シェルスクリプトとコマンド引数
#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)
と同じ意味になる
結果は正常終了なので
0
になる