私は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
ません。2exit
番目のケースを除くすべての場合に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[@]}"