다음과 같이 부울 값을 선언하는 방법을 찾고 있습니다.
HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}") // boolean
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}") // boolean
물론 위의 방법은 작동하지 않으며 오류가 발생합니다.
bash는 홈 명령을 찾을 수 없습니다
bash는 사용자 명령을 찾을 수 없습니다
이를 수행하는 먼 길은 다음과 같습니다.
HOME_IS_BASE_DIR=false;
USERS_IS_BASE_DIR=false;
if [ "home" == "${BASE_DIRECTORY}" ]; then
HOME_IS_BASE_DIR=true;
else if [ "Users" == "${BASE_DIRECTORY}" ]; then
USERS_IS_BASE_DIR=true;
fi
이것에 대한 약어가 있나요?
답변1
보다 간결한 표현은 다음과 같이 달성될 수 있습니다.
#!/bin/sh
BASE_DIRECTORY="home";
[ "home" = "$BASE_DIRECTORY" ] && HOME_IS_BASE_DIR=true || HOME_IS_BASE_DIR=false;
echo $HOME_IS_BASE_DIR;
답변2
case ${BASE_DIRECTORY} in
"home")
HOME_IS_BASE_DIR=true
USERS_IS_BASE_DIR=false
;;
"Users")
HOME_IS_BASE_DIR=false
USERS_IS_BASE_DIR=true
;;
*)
# Handle heretofore unhandled values here
;;
esac
정확하게 단축된 것은 아니지만 현재 수행 중인 작업에 대해 매우 명확하고 다른 위치로 쉽게 확장할 수 있습니다. 그러나 이러한 추가 변수를 사용하는 대신 ${BASE_DIRECTORY}를 살펴보는 것은 어떨까요?
답변3
다음과 같은 것을 요청하셨습니다.
HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}")
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}")
테스트를 함수로 전환할 수 있습니다.
HOME_IS_BASE_DIR() { [[ "home" == "${BASE_DIRECTORY}" ]]; }
USERS_IS_BASE_DIR() { [[ "Users" == "${BASE_DIRECTORY}" ]]; }
그런 다음 다음과 같은 테스트를 수행할 수 있습니다.
BASE_DIRECTORY="/"
if HOME_IS_BASE_DIR ; then echo "home is base dir" ; fi
if ! HOME_IS_BASE_DIR ; then echo "home is NOT base dir"; fi
if ! HOME_IS_BASE_DIR && \
! USERS_IS_BASE_DIR ; then echo "neither is base dir" ; fi
# output of above:
# home is NOT base dir
# neither is base dir
# ...or use &&/|| instead of 'if':
BASE_DIRECTORY="Users"
USERS_IS_BASE_DIR && echo "Users is base dir"
HOME_IS_BASE_DIR || echo "home is NOT base dir"
# output of above:
# Users is base dir
# home is NOT base dir
위 코드는 bash 및 zsh에서 작동하며 dash/POSIX에 쉽게 적용할 수 있습니다.
설명하다
쉘 스크립트에서는 종료 코드( ) 등에 대한 부울 표현식을 작성하는 것이 일반적입니다 cmd1 && cmdd
. 이 두 함수는 의 테스트에 해당하는 종료 코드를 생성하므로 [[ .. ]]
함수에 대한 부울 표현식을 구성할 수 있습니다.
함수는 테스트가 완료될 때마다 평가되므로 함수 BASE_DIRECTORY
가 변경되면 및 를 사용한 테스트 결과도 HOME_IS_BASE_DIR
변경 됩니다 USERS_IS_BASE_DIR
.