옵션 1

옵션 1

$1첫 번째 명령줄 인수( )의 길이가 10자 이상인지, 비어 있는지 확인하고 싶습니다 .

스크립트 이름은 다음과 같습니다.

./myscript.sh 2018-08-14

시도해봤지만 효과가 없었어요

timestamp="$1"

# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"
        exit 0
elif [! "${#timestamp}" -gt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi

답변1

훌륭한,

if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"

첫째, =대신 을 사용하십시오 ==. 전자는 표준이고 후자는 bashistic입니다(비록 ksh에서도 나온 것이라고 생각합니다). 둘째, 여기의 논리는 올바르지 않습니다 $#.보다 낫다1인 경우 매개변수 1은 비어 있을 수 없습니다(단, 빈 문자열로 설정될 수 있음). 어쩌면 당신은 그런 뜻일 수도 있지만 "$#" -lt 1, 그것도 그런 의미일 수도 있습니다 "$1" = "". 테스트 [ "$1" = "" ]도 충분할 것입니다 [ "$#" -lt 1 ].

elif [! "${#timestamp}" -gt 10 ]; then

여기서 쉘은 [!(문자 그대로)라는 명령을 실행하려고 시도합니다. 사이에 공백이 있어야 하므로 [ ! "${#timestamp}" -gt 10 ]와 동일합니다. [ "${#timestamp}" -le 10 ]예를 들어 와 같이 정확히 10자의 문자열도 캡처합니다 2018-08-14.

어쩌면 당신은 원할 것입니다 [ "${#timestamp}" -ne 10 ]. ( 문자열 비교인 경우에도 !=반대의 경우도 작동합니다.)-ne

if ...
    exit 0

일반적으로 오류가 발생하면 0이 아닌 종료 코드를 반환하므로 exit 1오류 분기에 사용됩니다.


case또는 를 사용하여 [[ .. ]]예상되는 형식으로 매개변수를 패턴화할 수도 있습니다 . 예를 들면 다음과 같습니다.

case "$1" in
    "")
        echo date is empty
        exit 1;;
    [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
        echo date is ok;;
    *)
        echo "date is _not_ ok"
        exit 1;;
esac

abcdefghij이는 길이가 10자라도 와 같은 매개변수도 거부합니다 .

답변2

다음 스크립트를 시도해 보세요.

옵션 1

timestamp="$1"

# check if command line argument is empty or not present
if [ -z $1 ]; then
        echo "Parameter 1 is empty"
        exit 0
elif [ "${#timestamp}" -lt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi

옵션 2

[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"

관련 정보