fc2ブログ

シェルスクリプトでのユーザ関数

シェルスクリプトでのユーザ関数

#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 文の使用方法

を参照するとわかりやすい

テーマ : Linux
ジャンル : コンピュータ

スクリプトでユーザ入力の受け付け

スクリプトでユーザ入力の受け付け

#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以外でも
入力すると終了するようになる

テーマ : Linux
ジャンル : コンピュータ

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

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

#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
の部分が引数扱いになる

テーマ : Linux
ジャンル : コンピュータ

シェルスクリプトの 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 の’と間違えやすいので注意

テーマ : Linux
ジャンル : コンピュータ

最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック