모든 폴더를 인쇄하는 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
if
bash와 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%/}
제거하는 데 사용됩니다 ./