파일의 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'

관련 정보