Bash의 간단한 논리 연산자
몇 가지 변수가 있으며 다음 조건을 확인하고 싶습니다 (단어로 작성된 다음 bash 스크립팅에서 실패한 시도).
if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then
do something
done.
그리고 실패한 시도에서 나는 다음을 생각해 냈습니다.
if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) );
then
scale=0.05
fi
실제로 작성한 것은 거의 효과가 있지만 (모든 변수가 숫자 인 경우 효과가 있음) 관용적 인 방법은 아닙니다.
(…)
괄호는 서브 쉘을 나타냅니다 . 그 안에 들어있는 것은 다른 많은 언어와 같은 표현이 아닙니다. 외부 괄호와 마찬가지로 명령 목록입니다. 이러한 명령은 별도의 하위 프로세스에서 실행되므로 괄호 안에서 수행되는 리디렉션, 할당 등은 괄호 밖에서 영향을 미치지 않습니다.{ … }
중괄호는 명령을 그룹화한다는 점에서 괄호와 비슷하지만 그룹화가 아닌 구문 분석에만 영향을 미칩니다. 이 프로그램x=2; { x=4; }; echo $x
은 4를x=2; (x=4); echo $x
인쇄 하는 반면 2를 인쇄합니다. (괄호는 닫을 때 괄호에는 공백과 세미콜론이 필요하지만 괄호는 필요하지 않습니다. 이는 구문상의 문제입니다.)((…))
이중 괄호 는 다른 프로그래밍 언어와 유사한 구문 으로 산술 명령어 , 즉 정수에 대한 계산을 둘러 쌉니다 . 이 구문은 대부분 할당 및 조건부에서 사용됩니다.- 동일한 구문이 산술 표현식에서 사용되며 표현식
$((…))
의 정수 값으로 확장됩니다.
- 동일한 구문이 산술 표현식에서 사용되며 표현식
[[ … ]]
이중 괄호는 조건식을 둘러 쌉니다 . 조건식은 대부분 변수가 비어 있는지 테스트하고 파일이 존재하는지 테스트 하는 등의 연산자를 기반으로 합니다. : 문자열 평등 사업자도 있습니다 (오른쪽이 패턴, 예를 들면 것을 조심 시험의 경우 와 시작 하면서 테스트하는 경우 정확히 ), 그리고 익숙한 , 그리고 부정, 결합 및 분리뿐만 아니라 그룹화 괄호에 대한 운영. 각 연산자 주위에 공백이 있어야하고 (예 : , not ), 괄호 안팎에 공백이나 문자가 있어야합니다 (예 : ,-n $variable
-e $file
"$string1" == "$string2"
[[ $foo == a* ]]
$foo
a
[[ $foo == "a*" ]]
$foo
a*
!
&&
||
[[ "$x" == "$y" ]]
[[ "$x"=="$y" ]]
;
[[ -n $foo ]]
).[[-n $foo]]
[ … ]
단일 괄호는 더 많은 기발한 (그러나 더 오래되고 더 휴대하기 쉬운) 조건식의 대체 형식입니다. 지금은 아무 것도 쓰지 마십시오. 스크립트가 포함 된 스크립트를 찾을 때 걱정하기 시작하십시오.
이것은 bash에서 테스트를 작성하는 관용적 방법입니다.
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
다른 쉘로 이식성이 필요한 경우 다음과 같이됩니다 (각 개별 테스트 주위에 추가 인용 부호와 별도의 괄호 세트 및 =
ksh / bash / zsh ==
변형이 아닌 기존 연산자 사용 ).
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then
아주 근접한
if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]];
then
scale=0.05
fi
작동해야합니다.
그것을 분해
[[ $varA -eq 1 ]]
다음과 같이 정수 비교입니다.
$varB == 't1'
문자열 비교입니다. 그렇지 않으면 비교를 올바르게 그룹화합니다.
이중 대괄호는 조건식을 구분합니다. 그리고 나는 다음 주제에 대해 잘 읽습니다. "(IBM) Demystify test, [, [[, ((및 if-then-else")
휴대 성이 뛰어난 버전 (레거시 bourne 쉘까지) :
if [ "$varA" = 1 -a \( "$varB" = "t1" -o "$varB" = "t2" \) ]
then do-something
fi
이것은 쉘의 풍미에 관계없이 최대 하나의 하위 프로세스 (프로세스 '[') 만 실행하는 추가 품질을 갖습니다.
변수에 숫자 값이 포함 된 경우 "="를 "-eq"로 바꾸십시오. 예 :
- 3 -eq 03은 사실이지만
- 3 = 03은 거짓입니다. (문자열 비교)
다음은 if-then-else 문의 짧은 버전에 대한 코드입니다.
( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"
다음에주의하십시오.
||
및&&
피연산자 경우 내부 상태 (즉, 둥근 괄호) 논리적 피연산자 (및 / 또는) 아르||
및&&
피연산자 외부 조건이라면 / 다른 의미
실제로 성명서는 다음과 같이 말합니다.
(a = 1 또는 b = 2) 인 경우 "ok", 그렇지 않으면 "nok"
if ([ $NUM1 == 1 ] || [ $NUM2 == 1 ]) && [ -z "$STR" ]
then
echo STR is empty but should have a value.
fi
참고 URL : https://stackoverflow.com/questions/6270440/simple-logical-operators-in-bash
'IT story' 카테고리의 다른 글
가장 일반적인 SQL 안티 패턴은 무엇입니까? (0) | 2020.04.19 |
---|---|
명령 행을 사용하여 postgres 백업 파일을 복원 하시겠습니까? (0) | 2020.04.18 |
끈적 끈적하고 비 스틱 세션 (0) | 2020.04.18 |
Servlet 3.0 API에 대한 Maven 종속성? (0) | 2020.04.18 |
Visual Studio Code에 빠른 변경 탭 기능이 있습니까? (0) | 2020.04.18 |