수색…


통사론

  • [[-OP $ 파일 이름]]
  • [[$ file1 -OP $ file2]]
  • [[-z $ string]]
  • [[-n $ string]]
  • [[ "$ string1"== "$ string2"]]
  • [[ "$ string1"== $ 패턴]]

비고

[[ … ]] 구문은 bash 내장 기본 조건식을 둘러 쌉니다. 브래킷 양쪽에 공백이 있어야합니다.

조건식은 단항 및 2 진 연산자를 사용하여 문자열, 정수 및 파일의 속성을 테스트 할 수 있습니다. 또한 논리 연산자 && , || 사용할 수 있습니다. 그리고 ! .

파일 비교

if [[ $file1 -ef $file2 ]]; then
  echo "$file1 and $file2 are the same file"
fi

"같은 파일"은 파일 중 하나를 수정하면 다른 파일에 영향을 미친다는 의미입니다. 예를 들어 하드 링크이거나 동일한 대상의 기호 링크이거나 다른 파일을 가리키는 기호 링크 인 경우와 같이 두 파일의 이름이 다른 경우에도 두 파일이 동일 할 수 있습니다.

두 파일의 내용이 같지만 파일을 수정하면 다른 파일에 영향을주지 않으므로 -ef 는 파일을 다른 것으로보고합니다. 두 파일을 바이트 단위로 비교하려면 cmp 유틸리티를 사용하십시오.

if cmp -s -- "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  echo "$file1 and $file2 differ"
fi

사람이 읽을 수있는 텍스트 파일 간의 차이점 목록을 생성하려면 diff 유틸리티를 사용하십시오.

if diff -u "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  : # the differences between the files have been listed
fi

파일 액세스 테스트

if [[ -r $filename ]]; then
  echo "$filename is a readable file"
fi
if [[ -w $filename ]]; then
  echo "$filename is a writable file"
fi
if [[ -x $filename ]]; then
  echo "$filename is an executable file"
fi

이 테스트는 사용 권한과 소유권을 고려하여 스크립트 (또는 스크립트에서 시작된 프로그램)가 파일에 액세스 할 수 있는지 여부를 결정합니다.

경쟁 조건 (TOCTOU)에 주의하십시오. 테스트가 성공했기 때문에 다음 줄에서 여전히 유효 함을 의미하지는 않습니다. 일반적으로 파일에 액세스하려고 시도하고 먼저 테스트하지 말고 오류를 처리 한 다음 그 동안 파일이 변경된 경우 오류를 처리해야합니다.

수치 비교

수치 비교는 -eq 연산자와 친구를 사용합니다.

if [[ $num1 -eq $num2 ]]; then
  echo "$num1 == $num2"
fi
if [[ $num1 -le $num2 ]]; then
  echo "$num1 <= $num2"
fi

6 개의 숫자 연산자가 있습니다.

  • -eq equal
  • -ne 동등하지 않은
  • -le 보다 작거나 같음
  • -lt 보다 적게
  • -ge 크거나 같음
  • -gt 보다 큼

[[ … ]] 안의 <> 연산자는 숫자가 아닌 문자열을 비교합니다.

if [[ 9 -lt 10 ]]; then
  echo "9 is before 10 in numeric order"
fi
if [[ 9 > 10 ]]; then
  echo "9 is after 10 in lexicographic order"
fi

양측은 십진수 (또는 선행 0이있는 8 진수)로 작성된 숫자 여야합니다. 또는 C / Java / ...와 같은 구문으로 정수 계산을 수행하는 ((…)) 산술 표현 구문을 사용하십시오.

x=2
if ((2*x == 4)); then
  echo "2 times 2 is 4"
fi
((x += 1))
echo "2 plus 1 is $x"

문자열 비교 및 ​​일치

문자열 비교는 인용 문자열 사이에 == 연산자를 사용합니다. != 연산자는 비교를 무효화합니다.

if [[ "$string1" == "$string2" ]]; then
  echo "\$string1 and \$string2 are identical"
fi
if [[ "$string1" != "$string2" ]]; then
  echo "\$string1 and \$string2 are not identical"
fi

오른쪽이 따옴표로 묶이지 않으면 $string1 이 일치하는 와일드 카드 패턴입니다.

string='abc'
pattern1='a*'
pattern2='x*'
if [[ "$string" == $pattern1 ]]; then
  # the test is true
  echo "The string $string matches the pattern $pattern"
fi
if [[ "$string" != $pattern2 ]]; then
  # the test is false
  echo "The string $string does not match the pattern $pattern"
fi

<> 연산자는 사전 식 순서로 문자열을 비교합니다 (문자열에 대해 덜 비슷하거나 더 크거나 같은 연산자가 없음).

빈 문자열에 대한 단항 테스트가 있습니다.

if [[ -n "$string" ]]; then
  echo "$string is non-empty"
fi
if [[ -z "${string// }" ]]; then
  echo "$string is empty or contains only spaces"
fi
if [[ -z "$string" ]]; then
  echo "$string is empty"
fi

위의 -z 검사는 $string 이 설정되지 않았거나 빈 문자열로 설정되었음을 의미 할 수 있습니다. empty와 unset을 구분하려면 다음을 사용하십시오.

if [[ -n "${string+x}" ]]; then
    echo "$string is set, possibly to the empty string"
fi
if [[ -n "${string-x}" ]]; then
    echo "$string is either unset or set to a non-empty string"
fi
if [[ -z "${string+x}" ]]; then
    echo "$string is unset"
fi
if [[ -z "${string-x}" ]]; then
    echo "$string is set to an empty string"
fi

여기서 x 는 임의적입니다. 또는 테이블 형식으로 :

                        +-------+-------+-----------+
            $string is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [[ -z ${string} ]]    | true  | true  | false     |
| [[ -z ${string+x} ]]  | true  | false | false     |
| [[ -z ${string-x} ]]  | false | true  | false     |
| [[ -n ${string} ]]    | false | false | true      |
| [[ -n ${string+x} ]]  | false | true  | true      |
| [[ -n ${string-x} ]]  | true  | false | true      |
+-----------------------+-------+-------+-----------+

또는 case 문에서 상태를 확인할 수 있습니다.

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

[:blank:] 는 로케일 별 수평 간격 문자 (탭, 공백 등)입니다.

파일 유형 테스트

-e 조건 연산자는 파일이 있는지 (모든 파일 형식 : 디렉토리 등을 포함하여) 테스트합니다.

if [[ -e $filename ]]; then
  echo "$filename exists"
fi

특정 파일 형식에 대한 테스트도 있습니다.

if [[ -f $filename ]]; then
  echo "$filename is a regular file"
elif [[ -d $filename ]]; then
  echo "$filename is a directory"
elif [[ -p $filename ]]; then
  echo "$filename is a named pipe"
elif [[ -S $filename ]]; then
  echo "$filename is a named socket"
elif [[ -b $filename ]]; then
  echo "$filename is a block device"
elif [[ -c $filename ]]; then
  echo "$filename is a character device"
fi
if [[ -L $filename ]]; then
  echo "$filename is a symbolic link (to any file type)"
fi

-L 과 별개로 기호 링크의 -L 테스트는 대상에 적용되고 끊어진 링크에 대해서는 false를 반환합니다.

if [[ -L $filename || -e $filename ]]; then
  echo "$filename exists (but may be a broken symbolic link)"
fi

if [[ -L $filename && ! -e $filename ]]; then
  echo "$filename is a broken symbolic link"
fi

명령의 종료 상태 테스트

종료 상태 0 : 성공
0 이외의 종료 상태 : 실패

명령의 종료 상태를 테스트하려면 다음을 수행하십시오.

if command;then
    echo 'success'
else
    echo 'failure'
fi

하나의 라이너 테스트

다음과 같은 일을 할 수 있습니다 :

[[ $s = 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s == 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s != 'something' ]] && echo "didn't match" || echo "matched"
[[ $s -eq 10 ]] && echo 'equal' || echo "not equal"
(( $s == 10 )) && echo 'equal' || echo 'not equal'

종료 상태에 대한 하나의 라이너 테스트 :

command && echo 'exited with 0' || echo 'non 0 exit'
cmd && cmd1 && echo 'previous cmds were successful' || echo 'one of them failed'
cmd || cmd1 #If cmd fails try cmd1


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow