2009-12-11 4 views
4
내가 (KSH) 콘 셸에 다음 코드를

설정하지 될 수 있습니다 변수 시험이 될하기 위해 FILE_EXT 변수의 원인이되는 파일 이름에 확장자가없는 경우에 따라서콘 셸 -

FAILURE=1 
SUCCESS=0 

isNumeric(){ 

    if [ -n "$1" ]; then 
     case $1 in 
      *[!0-9]* | "") return $FAILURE; 
         *) return $SUCCESS; 
     esac; 
    else 
     return $FAILURE; 
    fi; 
} 

#... 
FILE_EXT=${FILE#*.} 

if [ isNumeric ${FILE_EXT} ]; then 
    echo "Numbered file." 
fi 
#... 

등을 비어있는 경우 다음 오류가 발생합니다. ./script[37]: test: 0403-004 Specify a parameter with this command.

이 오류가 발생하지 않게하려면이 함수를 어떻게 호출해야합니까?

+0

내가 전체 파일 이름이있는 것으로 기대 파일 이름이 '.'로 끝나지 않는 한 아무것도 아닌 FILE_EXT. –

답변

5

함수의 종료 코드를 테스트 할 때는 대괄호를 사용하지 말아야합니다. 그렇지 않으면 항상 "true"가됩니다. 또한 변수를 인용해야합니다. 와 같이 빈 확장을 위해 추가 테스트를 둘 수 있었다 :

FILE_EXT=${FILE#*.} 

if isNumeric "${FILE_EXT}" && 
    [ "${FILE_EXT}" != "${FILE}" -a "${FILE_EXT}" != "" ] 
then 
    echo "Numbered file." 
fi 

편집 : "."가 끝나는 파일 이름을 처리하는 테스트를 추가

+0

'로 끝나는 파일은 고려하지 않습니다.'' –

+0

예, 변수를 인용해야합니다. – javaPlease42

0

[ -z "$1" ]는 의지 [ "" = "$1" ]로, 빈 $1에 대한 테스트합니다.

또는 숫자가 아닌지 확인하기 전에 간단히 "0"을 사용하여 (예 : "0$1") 앞에 비워 둘 수 있습니다 (빈 확장자를 숫자로 처리하려는 경우).

1

내가 이런 짓을 했을까 :

if [ isNumeric ${FILE_EXT:="no"} ]; then 
    echo "Numbered file." 
fi 

을 당신이 원하는 모든 파일이 FILE_EXT의 값, 또는 '아니오'중 하나를 확장하는 숫자 확장

${FILE_EXT:="no"}을 가지고 결정하는 경우 FILE_EXT가 null 또는 하늘의 경우

+1

점이 없으면 $ FILE_EXT는 전체 파일 이름을 포함하므로 숫자 만 구성된 파일 이름에 대해 거짓입니다. –

+0

예, 잘 잡습니다. –

0

필자의 스크립트를 실행할 probs가 있습니다. (아마 pdksh를 사용하기 때문에). 그래서 나는 그것을 약간 조정했다. 시도해보십시오

#!/usr/bin/ksh 

FILE=$1 
FAILURE=1 
SUCCESS=0 

isNumeric() 
{ 
    if [ -n "$1" ] 
    then 
     case $1 in 
      *[!0-9]* | "") 
       echo "$1 not a number" 
       return $FAILURE 
      ;; 
         *) 
       echo "$1 is a number" 
       return $SUCCESS 
      ;; 
     esac 
    else 
     echo "parameter is empty" 
     return $FAILURE 
    fi 
} 

#... 
FILE_EXT=${FILE#*.} 
echo $FILE_EXT 

isNumeric "${FILE_EXT}" 
if [ "$?" = "0" ] 
then 
    echo "Numbered file." 
fi 
1

${FILE##*.}에 "#"를 두 번 사용해야합니다. 변수 $ FILE_EXT가 비어 있다는 것은 무엇을 의미합니까? 파일에 확장명이없는 경우 ${FILE#*.}을 입력하면 FILE_EXT에 파일 이름이 표시됩니다. 어떻게 비어있는거야?

1

ksh93을 가정하면 자체 산술 연산을 사용할 수 있어야합니다. 그러나주의 할 필요가 있습니다. n == 0이면 Just ((n))가 실패하므로 적절한 수에 대해 항상 참이어야하는 ((n ||! n))을 테스트합니다.

ksh가 종료되지 않도록 subshell()에 표현식을 실행하여 공백을 추가하여 산술 표현식 ((...))과의 충돌을 방지합니다.

마지막으로, 우리는 '2> & -'와 stderr에 가깝습니다. 당신이에 보관 해 두는 것이 좋습니다 있지만, 숫자가 아닌 인수에서 오류 메시지를 방지하기 위해

function isNumeric { 
    (
    typeset n=${1:?} 
    ((n||!n)) 
) 2>& - 
}