値を返して関数を照会したいです。私のコードは次のとおりです。
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
true
false
それぞれ成功と失敗の終了コードで終了するコマンドです。関数がこれらの値を返すことはできません。これを行うには、コマンド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
ストリング比較を実行することです(正規表現マッチングではありません)。次の引数が検索パターンになるように指示します(そうでない場合は、パターンの最初の文字が導入されたコマンドラインオプションとして扱われます)-e
。grep
-
スクリプトが修正されました:
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