if의 두 가지 조건(양수만 가능, 문자 불가)

if의 두 가지 조건(양수만 가능, 문자 불가)

문자/단어가 아닌 양수만 허용하는 스크립트를 작성해야 합니다.

두 개의 if 조건을 만들었지만 함께 작동하지 않습니다. 하나를 제거하면 다른 하나는 잘 작동합니다. 어떻게 연결하나요?

    if [[ ${@:2} -lt 0 ]]; then
        shift
        echo "error, only positive"
        exit 3
    fi

    if [[ ${@:2} == [a-zA-Z] ]]; then
        echo "error, no letters allowed"
        exit 4
    fi

내 스크립트는 다음 줄로 실행됩니다. ./script.sh file.txt arg1 arg2 arg3 ... 따라서 arg1, arg2는 -1 또는 a가 될 수 없습니다.

답변1

아마도 모든 매개변수를 반복하고 각각을 테스트해야 할 것입니다. 두 가지 모두에 대해 테스트할 수 있다면 다음과 같이 할 수 있습니다. 이렇게 하면 모든 매개변수에 숫자만 있는지 확인할 수 있습니다(따라서 -또는 문자는 없지만 문자는 없습니다. 소수점 이하)

pattern='[^0-9]'
for arg; do
    if [[ $arg =~ $pattern ]]; then
        printf 'Unacceptable option: %s\n' "$arg"
        exit 3
    fi
done

별도의 테스트에 서로 다른 오류 메시지와 종료 코드가 포함되도록 하려면 for루프 및 test 에서 이를 수행 할 수 있습니다 arg. 그러면 각 명령줄 옵션이 차례로 표시됩니다.

답변2

다음과 같이 bash 비교 연산자를 활용할 수도 있습니다.

if [ $arg -eq $arg -a $arg -ge 0 ] 2>/dev/null ;then  
  echo "accepted"
else 
  echo "not accepted"
fi 

비결은 숫자가 아닌 두 인수를 -eq와 비교하면 bash가 오류를 발생시킨다는 것입니다(우리는 /dev/null로 보냅니다).

관련 정보