1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトの戻り値の問題を解決する

2022-02-09 02:39:45

javaやcなどの上級言語を勉強した人なら、関数の戻り値を取得したい場合、関数内にreturnを記述し、関数実行時に戻り結果を変数に代入すればよいでしょう。しかし、シェルスクリプトでは制約が多く、そのような機能を実現しようとすると、若干難しくなります。このあたりは、実際に実験してみたので、メモを共有します。

シェルスクリプトの戻り値にはreturnという引数が使えますが、returnは整数値しか返せません。そのため、シェルスクリプトはより複雑な関数に対してあまり親切ではないかもしれない。

例えば、次のような例です。

#! /bin/bash
function in_path(){
    cmd=$1
    path=$2
    oldIFS=$IFS
    IFS=":"
    retval=1
    for directory in $path
    do
     if [ -x $directory/$cmd ];then
        return 0
     fi
    done
    IFS=$oldIFS
    return 1
}
in_path ls $PATH
if [ $? -eq 0 ];then
  echo "yes"
else
  echo "no"
fi

このスクリプトは、環境変数PATHにlsコマンドが存在し、実行可能かどうかを調べ、存在する場合は0を、存在しない場合は1を返します。0はtrueを意味し、if文はtrueならyes、0ならnoを出力します。

文字列など、他の種類の変数の値を返したい場合もあるので、シェルスクリプトではreturnキーワードを使うことができません。

#! /bin/bash
function in_path(){
    cmd=$1
    path=$2
    oldIFS=$IFS
    IFS=":"
    retval=1
    for directory in $path
    do
     if [ -x $directory/$cmd ];then
        echo yes
     fi
    done
    IFS=$oldIFS
    echo no
}
aa=$(in_path $1 $PATH)
if [[ $aa =~ "yes" ]];then
    echo "the path has this bianliang"
else
    echo "no no no"
fi

これも戻り値の結果を取得する方法ですが、結構うまくいきますね。しかし、if文をcase文に置き換えて使うと、関数内のecho文とreturn文がこのロジックを理解するために返す、returnが違う、などということになります。

これは、シェルスクリプトの戻り値の問題についてのこの記事は終わりです、より関連するシェルスクリプトの戻り値の内容は、スクリプトハウスの過去の記事を検索してくださいまたは、次の関連記事を閲覧し続けるあなたは将来的にもっとスクリプトハウスをサポートして願っています!.