![스크립트의 첫 번째 인수가 -e 또는 -d인지 확인하세요.](https://linux55.com/image/148038/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%9D%B8%EC%88%98%EA%B0%80%20-e%20%EB%98%90%EB%8A%94%20-d%EC%9D%B8%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EC%84%B8%EC%9A%94..png)
나는 지금 bash 쉘 스크립트를 작성하고 있는데 사양 중 하나는 첫 번째 인수 $1이 -e 또는 -d가 아닌 경우 오류 메시지를 인쇄해야 한다는 것입니다. 이것이 제가 한 일입니다.
if [ "$1" != "-e" ] || [ "$1" != "-d" ]; then
echo "Error: First argument must be either -e or -d"
exit 1
fi
그러나 -e 또는 -d를 첫 번째 인수로 사용하더라도 이 오류 메시지가 계속 인쇄되기 때문에 이는 작동하지 않는 것 같습니다. 내가 뭘 잘못하고 있고 어떻게 해결할 수 있나요?
답변1
그렇다면 첫 번째 조건이 true입니다 $1
. -d
그렇다면 두 번째 조건이 true입니다 $1
. -e
둘 다 사실입니다. 당신이 합류한 이후로 ||
(또는), 이것그 다음에가지만약에둘 중 하나라도 사실이라면 받아들이십시오. 그러므로,그 다음에지점은 항상 점유되어 있습니다.
if [ "$1" != "-e" ] && [ "$1" != "-d" ]
당신은 사용해야 합니다그 다음에$1
그렇지 않은 경우에만 분기-e
그리고아니요 -d
.
답변2
case $1 in
-d) ;; # nothing to do
-e) ;; # nothing to do
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
이는 또는 이외의 다른 경우 exit 1
에 트리거됩니다 .$1
-d
-e
또는 사용된 옵션과 그에 대해 수행된 작업을 기반으로 플래그를 설정합니다(저는 별도로 유지하는 경향이 있습니다).분석하다명령줄 옵션은 다음에서 제공됩니다.성능그 중):
case $1 in
-d) dflag=1 ;;
-e) dflag=0 ;;
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
# Getting here means:
# - $1 was either -d or -e
# - $dflag will show which one it was
if [ "$dflag" -eq 1 ]; then
# act on -d option
else
# act on -e option
fi
~처럼일까츄가 해명했어, 귀하의 문제는 (누락된 큰따옴표 외에) 논리(부울 연산) 중 하나입니다. 위에서는 작업을 수행하는 또 다른 방법을 보여 드렸습니다. case
... esac
문은 일반적으로 명령줄 옵션을 처리하는 데 사용됩니다.