FreeBSD 이중 대괄호

FreeBSD 이중 대괄호

나는 이 코드를 가지고 있습니다 :

[[ "$1" =~ [/\\]$ ]]

Linux에서는 잘 작동하지만 FreeBSD에서 테스트하면 오류가 발생합니다. ./projekt2.sh: [[: not found두 시스템 모두에서 작동하는 대안이 있습니까? 감사해요

BASH 버전: 4.3.30(1)-출시됨

답변1

[[굴욕이다. /bin/shBourne Again 쉘은 보장되지 않습니다.

Linux 운영 체제에서도 Debian Almquist 셸 또는 정책을 준수하는 일반 셸일 수 있습니다. BSD에서는 Bourne Again 쉘이 아닙니다.BSD에서 Bourne Again 쉘은 운영 체제 자체에 대한 선택적 추가 기능입니다.. 내부에FreeBSD 포트 컬렉션. ("포트"는 해당 프로그램에 대해 외부에서 관리되는 소스 저장소에서 FreeBSD에 다른 프로그램(FreeBSD의 일부가 아님)을 구축하는 편리한 방법입니다.)

/bin/shBSD의 콘텐츠는 일반적으로 Bourne의 초기 재작성 중 하나입니다. FreeBSD에서는 Debian Linux와 마찬가지로 Almquist 쉘입니다. (OpenBSD에서는 POSIX 모드에서 실행되는 Korn 쉘입니다.)

바시즘에는 간단한 규칙이 있습니다:

스크립트에서 bashism을 사용하는 경우 이를 /bin/bash스크립트 인터프리터로 명시적으로 설정하세요. 대신 스크립트 해석기로 사용하는 경우 /bin/shPOSIX 호환 쉘 언어를 사용하세요.홀로.

=~또한 bashism이며 이 명령의 POSIX 호환 구문의 일부가 아닙니다 test. 그러나 여기서 정규식은 약간 과잉입니다. 분명히 여러분이 정말로 원하는 것은 마지막 문자를 확인하는 것뿐이기 때문입니다.

Thorsten Glaser가 2012년에 이런 종류의 일에 관해 제안한 내용은 다음과 같습니다.

케이스 $1
    */|*\\)
        그네;;
    *)
        그네;;
이삭

추가 읽기

답변2

[[구문은 ksh 및 bash이며 모든 쉘에 존재하지 않습니다. FreeBSD 기본 쉘은 bash 대신 일 수 있습니다 sh(또는 bash는 유사한 기능을 수행합니다 ). sh모든 쉘에 적용되는 동등한 구문은 다음과 같습니다.

case $1 in
        *[/\\] ) echo "Yes";;
esac

답변3

[[구조는 모든 sh 변형에 존재하지 않습니다. bash와 zsh에서 채택한 ksh입니다. FreeBSD의 sh는 ash의 파생물이며 지원되지 않습니다 [[.

[[스크립트에서 사용 하려면 다음을 사용하세요.셰르본지원팀에 문의하세요 [[. bash, ksh93 또는 mksh를 FreeBSD에 패키지로 설치할 수 있습니다 [[. 패키지는 아래에 설치되며 /usr/local/binLinux의 bash는 거의 항상 아래에 설치됩니다 /bin. 이를 사용하여 /usr/bin/env프로그램을 호출 할 수 있습니다 PATH(이것은 고전적인 해킹입니다). 따라서 bash 및 기타 bash 구성을 사용하려면 [[bash 패키지가 설치되어 있는지 확인하고 다음을 사용하여 스크립트를 시작하십시오.

#!/usr/bin/env bash

또는 Linux에서 심볼릭 링크를 만들고 다음을 /usr/local/bin/bash -> /bin/bash사용하여 스크립트를 시작합니다.

#!/usr/local/bin/bash

/bin/bash -> /usr/local/bin/bash또는 FreeBSD에서 심볼릭 링크를 만들고 #!/bin/bash.

또는 공통 sh 코어를 따르는 스크립트를 작성하십시오. [대신 사용하십시오 [[. 이것은 [예약어가 아닌 일반 명령이므로 단일 괄호 안에 있는 내용은 이중 괄호 안에 있는 내용과 달리 정상적으로 구문 분석됩니다 [[ condition1 && condition2 ]]. 대괄호를 작성해야 합니다 [ condition1 ] && [ condition2 ]. 일반 sh에는 정규식 일치 구성이 없지만 수행 중인 작업에는 와일드카드 패턴 일치로 충분합니다.

case "$1" in
  *[\\/]) echo "$1 ends with a slash or backslash";;
  *) echo "$1 does not end with a slash or backslash";;
esac

관련 정보