Bashスクリプト入門
Alex Scriven
Data Scientist
関数への引数の渡し方は、スクリプトと同様に $1 記法を使います。
以前説明した特別な ARGV プロパティも利用できます。
$1, $2 で参照$@ と $* は ARGV の全引数$# は引数の数ファイル名を関数の引数として渡してみます。ループで回して出力します。
function print_filename { echo "The first file was $1"for file in $@ do echo "This file has name $file" done }print_filename "LOTR.txt" "mod.txt" "A.py"
The first file was LOTR.txt
This file has name LOTR.txt
This file has name mod.txt
This file has name A.py
「スコープ」とは、変数へのアクセス可能範囲を指します。
なぜ重要か? ローカルのみのものに外からアクセスすると、エラーで失敗します。
多くの言語(例: Python, R)と異なり、Bash の変数は既定でグローバルです。
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
グローバルは意図しない影響のリスクが高く、危険な場合があります。注意。
local キーワードで変数のスコープを制限できます。
function print_filename { local first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
Q: なぜエラーではなく空行になったのか?
A: first_filename はグローバルの最初の ARGV 要素($1)に代入されたためです。
引数なし(bash script.sh)で実行したため、空要素になりました。注意しましょう。
引数を関数に渡す方法は分かりました。では値を返すには?
Bash の return は成功(0)か失敗(1–255)のみを示し、グローバル変数 $? に入ります。
選択肢は次のとおりです。
echo し、コマンド置換で取得する戻りエラーを見てみます。
function function_2 { echlo # An error of 'echo' }function_2 # Call the function echo $? # Print the return value
script.sh: line 2: echlo: command not found
127
何が起きたか?
$? の戻り値は 127(エラー)echo とコマンド置換で、スクリプト内の他所で使う値を正しく返します。
function convert_temp { echo $(echo "scale=2; ($1 - 32) * 5 / 9" | bc) }converted=$(convert_temp 30) echo "30F in Celsius is $converted C"
30F in Celsius is -1.11 C
Bashスクリプト入門