Q1シェル関数の中で 1 番目の引数を参照する書き方はどれですか?
関数 — 同じ処理を 1 か所にまとめる
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
name() { ... } で処理を定義し $1で引数を受け取り、localで関数内だけの変数を作り、returnと $? で成否を分岐させて同じ検証ロジックを使い回す書き方を、図解と端末で確認します。
処理に名前を付ける — 関数定義と引数
同じ処理を何度も書く代わりに、関数としてまとめて名前で呼び出せます。
name() { ... }で定義し、本体は{と}の間に書きます。
定義した後にnameと書くと、その処理が実行されます。
長いスクリプトを意味のある単位に分けられ、修正も 1 か所で済みます。
また関数に値を渡すには、呼び出すときにname foo barのように引数を続けます。
関数の中では$1が 1 番目、$2が 2 番目の引数を表します(スクリプト本体の位置パラメータと同じ書き方です)。
引数は二重引用符で"$1"と囲むと、空白を含む値でも 1 つの引数として扱えます。
greet() { # 関数を定義
echo "hello, $1"
}
greet alice # hello, alice
greet bob # hello, bob
greet alice bobの値が$1 $2に入り、関数の本体でそれらを使って処理します。| 書き方 | 意味 | 例 |
|---|---|---|
name() { … } | 関数を定義する | greet() { echo "hi $1"; } |
name 引数 | 関数を呼び出す | greet alice |
$1 | 関数内で 1 番目の引数を参照 | echo "name=$1" |
$2 | 関数内で 2 番目の引数を参照 | echo "port=$2" |
関数内だけの変数 — local
関数の中でlocal v=...と宣言すると、その変数は関数の中だけで有効になり、関数を抜けると消えます。
localを付けないと、同じ名前の変数を関数の外でも書き換えてしまい、思わぬ副作用が起きます。
関数を部品として安全に再利用するために、内部で使う作業用変数はlocalにします。
msg="outer"
show() {
local msg="inner" # 関数内だけの変数
echo "in func: $msg"
}
show # in func: inner
echo "outside: $msg" # outside: outer(外は変わらない)
localの変数は関数の中だけで有効です。同名でも外側の値は変わりません。| 書き方 | 意味 | 例 |
|---|---|---|
local v=… | 関数内だけで有効な変数を作る | local step=1 |
v=… | スクリプト全体で有効な変数 | status=ready |
成否を返す — return と $?
関数はreturn Nで終了コードを返せます。
0が成功、0以外が失敗という慣習で、呼び出した直後に$?でその値を確認できます。
if check "$x"; then ...のように、関数の成否でそのまま分岐すると、検証と処理の流れが読みやすくなります。
is_num() {
case "$1" in
*[!0-9]*|"") return 1 ;; # 数字以外を含むか空なら失敗
*) return 0 ;;
esac
}
is_num 12; echo "12 -> $?" # 12 -> 0
is_num abc; echo "abc -> $?" # abc -> 1
returnの値が$?に入り、ifは0を成功、0以外を失敗として分岐します。| 書き方 | 意味 | 例 |
|---|---|---|
return 0 | 成功として関数を抜ける | is_num 12; # 成功 |
return 1 | 失敗として関数を抜ける | is_num abc; # 失敗 |
$? | 直前の関数の戻り値を確認 | is_num 12; echo $? |
if name x; then … | 戻り値で直接分岐する | if is_num "$v"; then …; fi |
理解度チェック
まずは1問ずつ答えてみましょう。
Q2localを付けて宣言した変数の有効範囲はどれですか?
Q3関数の直前の戻り値を確認するのはどれですか?