zsh의 단일 대괄호 내 문자열 비교

zsh의 단일 대괄호 내 문자열 비교

모든 폴더를 인쇄하는 Bash 코드:

for f in ~/*;
do
if [ $f  == '/home/sk/.' -o $f  == '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

그것은 bash와 함께 작동합니다. z 쉘에서 코드를 실행하면 오류가 발생합니다.

 = not found

그런 다음 z 셸에서 이 오류를 피하기 위해 , [로 변환하고 z 셸에서 실행했습니다. 다음 오류가 발생합니다.[[]]]

condition expected: $f

[[and 를 사용하면 ]]bash도 오류를 발생시킵니다:

syntax error in conditional expression
syntax error near `-o'

셸 전체에서 작동하는 셸의 문자열 비교를 위한 POSIX 표준이 있습니까?

답변1

여기에는 온갖 종류의 문제가 있습니다. 첫째, ==표준이 아닙니다. POSIX 방식은 =동일하게 적용됩니다 -o. 이는 bash 및 zsh에서도 작동합니다.

for f in ~/*;
do
if [ "$f"  = '/home/sk/.' ] || [ "$f"  = '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

ifbash와 zsh 모두에서 기본적으로 도트 파일은 무시됩니다 . 간단히 다음과 같이 작성할 수 있습니다.

for f in ~/*; do echo "$f"; done

심지어

printf "%s\n" ~/*

답변2

노력하다:

if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]

답변3

귀하의 질문에 대한 직접적인 대답은 아니지만 조건부는 POSIX 사양에서 또는 *확장되지 않기 때문에 불필요합니다....

또한 모든 폴더를 인쇄하고 싶다고 말씀하셨기 때문에 /후행 폴더를 지정 해야 합니다.

따라서 이와 같은 내용은 숨겨진 디렉토리가 아닌 모든 디렉토리를 인쇄하기에 충분합니다.

for d in ~/*/
do
  [ -d "$f" ] && printf "%s\n" "${d%/}"
done

디렉토리 항목에 대한 테스트를 참고하세요. 그렇지 않으면 디렉토리가 없으면 패턴이 인쇄됩니다. 패턴으로 인한 번짐을 ${d%/}제거하는 데 사용됩니다 ./

관련 정보