(bash) 셸 스크립팅에 대한 두 가지 오해가있는 것으로 보입니다.
처음에 라인 if [ $var1 > $var2 ] then echo ...
은 구문 상 틀 렸습니다. 실제로 메모리에서 다시 입력하지 말고 예제 명령이나 코드를 붙여야합니다. if [[ "$var1" > "$var2" ]]; then ...
또는 if [ "$var" \> "$var2" ]; then ...
이라고 말하면 괜찮습니다.
[(단일 브래킷)은 /usr/bin/[
(별칭은 /usr/bin/test
) 명령의 쉘 내장 구현을 소개하는 반면 [[
은 bash 특정 조건식입니다.
이전 [
(test
) 명령에는 bash에서 [[
지원보다 훨씬 제한적인 기능이 있습니다. 그것은 단지 -lt
, -eq
... 그리고 다른 정수 비교와 다양한 파일과 가치 길이를 지원 그들 중 일부가 될 필요가 같이 배쉬 built-in for
가 [supports a number of the
[[`확장하지만, 명시 적으로 기존의 탈출 (-z' and
-n ) and other tests. It has no support for lexical/string or pattern (regex nor glob) comparisons. The
구문 분석.
는 또한 (따옴표와 "$var"
대) $var
의 바 역 참조를 사용하는 것이 위험 해 있습니다. var
에 할당 된 값이 어떤 공백 또는 test
명령에 스위치으로 융합 할 수있는 다양한 사업자가있는 경우 .
또한 then
절에서 if
명령을 분리하려면 ;
이 필요합니다.
셸이 일반적인 프로그래밍 언어 인 것처럼 셸 스크립트를 작성하려고하면 이런 종류의 혼동이 생길 수 있습니다. bash
과 같은 쉘은 구문 및 내장 기능이 상대적으로 적으며 대부분 명령 실행과 관련하여 접착제가 사용됩니다. 초기 버전의 UNIX에서는 셸에 내장 테스트가없고 외부의 test
명령에 전적으로 의존했습니다. 시간이 지남에 따라 쉘에 내장 된 기능이 점점 더 많아졌습니다. 오래된 명령어의 별명을 통해 종종 ("/usr/bin/[' is literally a link to the
/usr/bin/test command and the shell built-ins for
[and
test`는 서로에 대한 내부 별명이며 오래된 (아직도 현존하는) 외부 바이너리.
마찬가지로 모든 산술 연산을 초기의 Bourne 셸은. 같은 /usr/bin/expr
같은 외부 명령을 사용하여 수행 Korn 쉘 및 배쉬를 위해 $ ((...))와 let
및 ((...))
표현 을 추가했다 외부 명령 지원없이 쉘 내에서 산술 표현식을 평가.
다른 예제는 배열 (declare
) 및 매개 변수 확장 ${var#...}
다양한 다른 형식.
일반적으로 이러한 기능을 사용하지 않는 경우 점차적으로 이식성이 떨어지기 때문에 이러한 기능을 대부분 피하거나 사용하지 않는 것이 좋으며 ... 구문 방식이 급격하게 코드를 압도합니다. 어느 시점에서 Perl, Python, Ruby 또는 일반적인 프로그래밍 작업을 수행하고 셸을 디자인 목적으로 사용하는 데 필요한 범용 프로그래밍/스크립팅 언어를 사용하는 것이 가장 좋습니다. 외부 명령 주위에 접착제로, 데이터를 마샬링하고 외부 명령/프로세스의 변수들.
덜 작거나 같은 연산자가 있습니까? [[$ var1 <= $ var2]]이 (가) 작동하지 않는 것 같습니다. – Jaan
@Jaan, 아니요, bash에는'<='와 같은 문자열 기반 복합 연산자가 없습니다. 반대 동작을 부정함으로써 아주 쉽게 에뮬레이트 할 수 있습니다 : 개념적 ['[[$ a <= $ b]]'은 실제'[[! $ a> $ b]]'. – paxdiablo