ファイルのn行目を印刷し、プロセスが失敗したかどうかを検出する方法は?

ファイルのn行目を印刷し、プロセスが失敗したかどうかを検出する方法は?

次の名前のファイルがあります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など)以外の値の場合は$NAMEfalseになります。常に私に終了値を与えます。同じことをしてください。$NAMEIDsed0awk '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'

関連情報