如何打印文件的第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), 我希望$NAME为 false 。总是给我一个退出值。 做同样的事情。$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

使用awkPOSIXly:

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'

相关内容