引数、戻り値、スコープ

Bashスクリプト入門

Alex Scriven

Data Scientist

Bash 関数への引数の受け渡し

関数への引数の渡し方は、スクリプトと同様に $1 記法を使います。

以前説明した特別な ARGV プロパティも利用できます。

  • 各引数は $1, $2 で参照
  • $@ と $* は ARGV の全引数
  • $# は引数の数
Bashスクリプト入門

引数の受け渡し例

ファイル名を関数の引数として渡してみます。ループで回して出力します。

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
Bashスクリプト入門

プログラミングにおけるスコープ

 

「スコープ」とは、変数へのアクセス可能範囲を指します。

  • 「グローバル」は、FOR、IF、関数内などプログラム全体で参照可。
  • 「ローカル」は、特定の範囲内のみ参照可。

なぜ重要か? ローカルのみのものに外からアクセスすると、エラーで失敗します。

Bashスクリプト入門

Bash 関数のスコープ

多くの言語(例: Python, R)と異なり、Bash の変数は既定でグローバルです。

function print_filename {
    first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt

グローバルは意図しない影響のリスクが高く、危険な場合があります。注意。

Bashスクリプト入門

Bash 関数でスコープを制限する

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スクリプト入門

戻り値

引数を関数に渡す方法は分かりました。では値を返すには?

Bash の return は成功(0)か失敗(1–255)のみを示し、グローバル変数 $? に入ります。

選択肢は次のとおりです。

  1. グローバル変数に代入する
  2. 関数の最後の行で echo し、コマンド置換で取得する
Bashスクリプト入門

戻り値のエラー

戻りエラーを見てみます。

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

何が起きたか?

  1. 関数呼び出し時にエラーが発生
    • スクリプトは 'echlo' をプログラムとして探したが存在しなかった
  2. $? の戻り値は 127(エラー)
Bashスクリプト入門

正しい値の返し方

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スクリプト入門

Passons à la pratique !

Bashスクリプト入門

Preparing Video For Download...