Bashスクリプト関数はTrue-Falseを返します。

Bashスクリプト関数はTrue-Falseを返します。

値を返して関数を照会したいです。私のコードは次のとおりです。

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            true
            break
        else
            false
        fi
    done < $file
}

printf "Please enter the value : "
read keyboard

if check $keyboard;
then
    echo "yes";
else
    echo "no";
fi

動作しません。私が何を間違っているのでしょうか?

答え1

truefalseそれぞれ成功と失敗の終了コードで終了するコマンドです。関数がこれらの値を返すことはできません。これを行うには、コマンドreturnと成功(0)または失敗(ゼロ以外のすべての値)に対応する整数値を使用します。また、一致しない最初の行については失敗を返したくないと確信しています。いいえ行一致:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            return 0    # 0 = success ("true"); break is not needed because return exits the function
        fi
    done < $file
    # If a line matched, it won't get here (it will have returned out of the middle
    # of the loop). Therefore, if it gets here, there must not have been a match.
    return 1    # 1 = failure ("false")
}

しかし、これを行うより簡単な方法があります。使用grep- そのアクションは、ファイル内の一致する行を検索することです。grep -Fxq--F正規表現パターンではなく固定文字列検索を意味し、行-xの一部ではなく行全体と一致する必要があることを意味し、-q一致するものが見つかった場合は成功した状態で結果を印刷する必要がないことを意味します。終了し、そうでなければ失敗します。return関数は暗黙的に最後のコマンドのステータスを返すため、明示的なコマンドも必要ありません。

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    grep -Fxq "$funkx" "$file"
}

それとももっと簡単です:

check(){
    grep -Fxq "$1" /root/Turkiye.txt
}

答え2

別のファイルでコードをテストした場合する少し非効率的でも実際には機能します。/root/Turkiye.txtファイルがアクセス可能な空でないファイルであると仮定すると、true呼び出しfalse(関数で実行される最後のコマンドであるため)は関数の終了状態を0または0以外に設定します。

スクリプトに入力した文字列が、読み取っているファイルに別々の行として見つからない可能性があります。残念ながら、解析中のファイルの外観、スクリプトに入力する内容、この操作を実行するときにスクリプトが何を取得したいのかは不明です。

また、while read line読む必要はないことに注意してください。ワイヤー入力ファイルから。たとえば、「IFS=read-r-line」を理解する"、およびisは、[ ... ]2つの文字列を比較する演算子には含ま=れません==

また、単語の区切りやファイル名の生成(ワイルドカード)を防ぐ$keyboardには、呼び出し時に二重引用符を使用する必要があります。check


ユーザーから読み取られた文字列が特定のファイルに1行で表示されることを確認する関数を使用したいようです。

これは簡単に行えます。

grep -qxF -e "$keyboard" /root/Turkiye.txt

このgrepコマンドは、指定されたファイルから文字列を検索し、終了ステータス0を返します(本物)同じ行が見つかると、そうでなければゼロ以外の終了ステータスが返されます(間違った)。ここで使用されるオプションは、何も-q出力grepせず、-x行全体を比較し(サブストリングではなく)、-Fストリング比較を実行することです(正規表現マッチングではありません)。次の引数が検索パターンになるように指示します(そうでない場合は、パターンの最初の文字が導入されたコマンドラインオプションとして扱われます)-egrep-

スクリプトが修正されました:

printf 'Please enter the value: ' >&2
IFS= read -r keyboard

if grep -qxF -e "$keyboard" /root/Turkiye.txt; then
    echo 'yes'
else
    echo 'no'
fi

ユーザー入力文字列のプロンプトを標準エラーストリームとして出力していることに注意してください。これは慣例に従ってスクリプトの出力をプロンプトなしでリダイレクトして使用できるようにすることです。

では、bash次を使用します。

IFS= read -r -p 'Please enter the value: ' keyboard

(をbash使用すると、プロンプト文字列も標準エラーストリームとして出力されますread -p。)

grep関数で使用するには、次の手順を実行します。

check () {
    grep -qxF -e "$1" /root/Turkiye.txt
}

その後、使用

if check "$keyboard"; then
    echo 'yes'
else
    echo 'no'
fi

関連情報