$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"