저는 Bash를 배우고 있으며 기본 기능을 작성했습니다.
wsgc () {
# Wipe the global variable value for `getopts`.
OPTIND=1;
echo "git add -A";
while getopts m:p option;
do
case "${option}"
in
m)
COMMIT_MESSAGE=$OPTARG
if [ "$COMMIT_MESSAGE" ]; then
echo "git commit -m \"$COMMIT_MESSAGE.\""
else
echo "A commit message is required."
exit
fi
;;
p)
echo "git push"
exit
;;
\?)
echo "Invalid parameter."
exit
;;
esac
done
}
그러나 몇 가지 문제로 어려움을 겪고 있습니다.
in은 작동하지 않습니다. 인수를 생략하면
if
Bash가m)
개입하여 나를 세션에서 쫓아내기 때문입니다.git add -A -bash: option requires an argument -- m Invalid parameter. logout Saving session... ...copying shared history... ...saving history...truncating history files... ...completed.
[처리완료]
다음을 실행한 후
wsgc -m "Yo!" -p
세션에서 쫓겨났습니다.git add -A git commit -m "Yo." git push logout Saving session... ...copying shared history... ...saving history...truncating history files... ...completed.
[처리완료]
어떤 조언이라도 대단히 감사하겠습니다.
답변1
m)의 if가 작동하지 않습니다. 인수를 생략하면 Bash가 개입하여 나를 세션에서 쫓아내기 때문입니다.
뒤에 지정하는 getopts m:p option
것은 인수가 필요하다는 것을 의미합니다. 제공하지 않으면 오류가 발생합니다.:
m
실행 후: wsgc -m "Yo! -p, 세션에서 쫓겨났습니다.
세션에서 쫓겨난다는 것은 무엇을 의미하나요? 껍질이 사라졌나요? 그 이유는 스크립트를 실행하지 않고 가져왔기 때문입니다.
즉, 를 getopt
사용하는 것이 좋습니다 getopts
.
답변2
-m
옵션이 값을 얻지 못하면 쉘exit
을 종료합니다.-p
이 옵션을 사용하면exit
셸에서 작업하게 됩니다.- 잘못된 옵션을 사용하면
exit
쉘이 종료됩니다.
이 모든 경우에 있어서는 return
안 되며 exit
, 두 번째 경우를 제외한 모든 경우에 return 1
오류 신호를 보내야 합니다. 또한 오류 메시지는 .redirect 를 사용하여 표준 오류 스트림으로 리디렉션되어야 합니다 >&2
.
다음은 명령줄이 원활하게 구문 분석되지 않는 한 아무것도 출력하지 않는 몇 가지 수정 사항이 포함된 함수 버전입니다.
wsgc () {
local OPTIND=1
local out=( "git add -A" )
while getopts 'm:p' opt; do
case "$opt" in
m) out+=( "git commit -m '$OPTARG'" ) ;;
p) out+=( 'git push' ) ;;
*) return 1 ;;
esac
done
printf '%s\n' "${out[@]}"
}
출력을 정렬해야 하는 경우(명령줄의 마지막 출력이 위 함수를 사용하는 경우 git push
마지막 출력만 됩니다) 플래그를 사용하세요. -p
이것은 또한아니요옵션을 여러 번 사용하면 여러 명령이 출력됩니다.
wsgc () {
local OPTIND=1
local message
local do_push=0
while getopts 'm:p' opt; do
case "$opt" in
m) message="$OPTARG" ;;
p) do_push=1 ;;
*) return 1 ;;
esac
done
local out=( "git add -A" )
if [[ -n "$message" ]]; then
out+=( "git commit -m '$message'" )
fi
if (( do_push )); then
out+=( 'git push' )
fi
printf '%s\n' "${out[@]}"
}
함수의 마지막 비트는 다음과 같이 단축될 수 있습니다.
local out=( "git add -A" )
[[ -n "$message" ]] && out+=( "git commit -m '$message'" )
(( do_push )) && out+=( 'git push' )
printf '%s\n' "${out[@]}"