이 질문은 내 질문의 후속입니다.이전 질문. 이 사이트의 사용자들은 for
문자열 값을 반복하는 bash 루프를 작성하는 방법을 알아내는 데 친절하게 도움을 주었습니다 . 예를 들어, 루프 제어 변수가 fname
문자열을 반복한다고 가정합니다 "a.txt" "b.txt" "c.txt"
. 값이 있으면 echo
"예!"를 원 하고 그렇지 않으면 "아니요!"를 원합니다 . 다음 bash 쉘 스크립트를 시도했습니다.fname
"a.txt"
"c.txt"
echo
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
나는 출력을 얻습니다 :
a.txt
아니요!
b.txt
아니요!
c.txt
예!
if
이 진술 에 값이 있는데 왜 분명히 true가 되는 걸까요 ? 제가 잘못 사용한 걸까요?fname
"a.txt"
|
답변1
말하고 싶다면 OR
이중 파이프( ||
)를 사용하세요.
if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
(원래 사용된 OP 코드는 |
일반 파이프가 작동하는 것과 같은 방식으로 출력을 왼쪽에서 오른쪽으로 단순히 파이프했습니다.)
수년간의 논평과 오해 끝에, 제가 명확히 설명하겠습니다.
OR
귀하의 사용을 위해 ||
.
사용 여부는 [
상황 [[
에 따라 달라집니다 test
. ((
모든 상황에서 둘 중 하나가 선호된다고 말하는 것은 잘못된 것입니다. 때로는 [
맞을 때도 있고, [[
틀릴 때도 있습니다. 그러나 그것은 문제가 아닙니다. OP는 왜 |
작동하지 않는지 물었습니다. 대답은 그 ||
반대여야 하기 때문입니다.
답변2
허용되는 답변은 훌륭하지만 bash를 사용하고 있으므로 bash 솔루션을 추가하겠습니다.
if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then
이는 bash 참조 매뉴얼에 문서화되어 있습니다.3.2.4.2 조건부 구성
식1 && 식2
표현식1과 표현식2가 모두 참이면 참입니다.
식1 ||식2
표현식1 또는 표현식2가 참이면 참입니다.
&& 및 || 연산자는 표현식 1의 값이 전체 조건식의 반환 값을 결정하기에 충분한 경우 표현식 2를 평가하지 않습니다.
답변3
이와 같이 OR 조건을 사용할 수도 있습니다.
if test "$fname" = "a.txt" || test "$fname" = "c.txt"
답변4
이렇게 사용하거나 조정할 수 있습니다
if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]