
다음과 같은 이름의 파일이 있습니다 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'