if 절을 사용하여 내부적으로 읽기 - bash

if 절을 사용하여 내부적으로 읽기 - bash

스크립트가 있습니다.

#!/bin/bash

if [[ read -t 10 -sp "Enter Password: " passwd ]]; then
    echo -e "\nPassword: ${passwd}"
else
    echo -e "\nInput timed out" >&2
    exit 1
fi

exit 0

하지만 오류가 발생합니다.

./script.sh: line 3: conditional binary operator expected
./script.sh: line 3: syntax error near `-t'
./script.sh: line 3: `if [[ read -t 10 -sp "Enter Password: " passwd ]]; then'

내 코드에 문제가 있나요?

답변1

그럴 필요는 없습니다 [[ ... ]]. 다음과 같이 다시 작성하면 됩니다.

#!/bin/bash

if read -t 10 -sp "Enter Password: " passwd; then
  echo -e "\nPassword: ${passwd}"
else
  echo -e "\nInput timed out" >&2
  exit 1
fi

exit 0

또는 읽기 쉽고 짧습니다.

#!/bin/bash
read -t 10 -sp "Enter Password: " passwd || echo -e "\nInput timed out" >&2 && exit 1
echo -e "\nPassword: ${passwd}"
exit 0

고쳐 쓰다:

없이 작동하는 이유를 이해하려면 [[ ... ]]bash man을 확인해야 합니다.

목록이면 목록; 목록이면 ] ... [다른 목록]

이것나열된 경우처형되다. 종료 상태가 0이면그런 다음 나열 처형되다. 그렇지 않으면 각엘리프 목록순서대로 실행됩니다. [...]

이 예에서 The는 if list읽기 명령입니다. [ $? -eq 0 ]또한 test $? -eq 0특정 종료 상태가 있는 유효한 목록입니다. [[ expression ]](bash man에 따르면) 역시 유효한 목록이지만 read -t 10 -sp "Enter Password: " passwd유효한 표현식은 아닙니다. 이 사람을 보면 효과적인 표현이 무엇인지 알 수 있습니다.

답변2

문에서 명령을 사용하고 있는데 [[ ]], 이는 말이 되지 않습니다. 이 연산자는 test특정 조건을 확인하는 함수처럼 사용되어야 합니다 .

read명령을 개별적으로 실행하고 종료 코드를 확인하는 것이 좋습니다 .

#!/bin/bash

read -t 10 -sp "Enter Password: " passwd

if [ $? -eq 0 ]; then
    echo -e "\nPassword: ${passwd}"
else
    echo -e "\nInput timed out" >&2
    exit 1
fi

exit 0

관련 정보