수색…
통사론
- [[-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