我有一个名为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
使用awk
POSIXly:
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'