次の名前のファイルがありますnamelist
。
george
cindy
chester
私はnl namelist
次の生産に使用します。
1 george
2 cindy
3 chester
私は次の内容を含むスクリプトでこのリストを使用したいと思います。
while [ true ]; do
read -p "Who are you? " NAMEID
NAME="$(sed ''"$NAMEID"'q;d' namelist)
if $NAME;
then
echo "Hello."
return
else
echo "Sorry, that's not a valid name."
fi
done
$NAMEID
有効な値は1、2、3です。 1、2、または3(97またはfasdhjなど)以外の値の場合は$NAME
falseになります。常に私に終了値を与えます。同じことをしてください。$NAMEID
sed
0
awk 'NR==$NAMEID {print; err = 1}' namelist
今はOS X 10.11を使用していますが、スクリプトが完成したらUbuntu 16.04を使用する予定です。
答え1
人の名前を返すように変数定義を変更することでNAME
これをテストできます。最初の考えは、おそらく次のようになります。
NAME="$(sed -n "${NAMEID}p" namelist)"
ただし、NAMEIDに無効なデータが含まれているため、これは潜在的に問題になる可能性があります(誰かが「hello」または「-10」を入力した場合はどうなりますか...)。
だから私たちは以下を使用しますawk
:
NAME="$(awk -vNAMEID="$NAMEID" 'NR==NAMEID { print ; exit }' namelist)"
これで、値が範囲外またはユーザー名が保存されると空になります。
$ cat namelist
george
cindy
chester
$ cat tstscript
getname()
{
while [ true ]; do
read -p "Who are you? " NAMEID
NAME="$(awk -vNAMEID="$NAMEID" 'NR==NAMEID { print ; exit }' namelist)"
if [ -n "$NAME" ]
then
echo "Hello $NAME."
return
else
echo "Sorry, that's not a valid name."
fi
done
}
getname
$ bash tstscript
Who are you? 4
Sorry, that's not a valid name.
Who are you? hello
Sorry, that's not a valid name.
Who are you? -45
Sorry, that's not a valid name.
Who are you? 2
Hello cindy.
答え2
POSIXlyを使用してくださいawk
:
id=$NAMEID awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}' <file
例:
$ echo 1 | id=1 awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}'
1
$ echo "$?"
0
$ echo 1 | id=2 awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}'
$ echo "$?"
1
GNUの使用sed
:
sed -n -e "$NAMEID{p;q;}' -e '$q1'