私はいくつかの仕事を自動化するためにbashスクリプトを書いていますが、それまでの間bashで練習しています。私はいくつかの git のクローン作成と更新を自動化するスクリプトを書いています。私のスクリプトには 3 つのオプション (-g、-f、-h) があります。誰かが -h と入力すると、ヘルプ メッセージが表示されます (これは私が書きましたが、以下では省略しています)。誰かが -g と入力すると、少なくとも 1 つの引数を受け入れる必要がありますが、2 つ目の引数をオプションとして受け入れることもできます。最初のものは複製するリポジトリの URL になり、2 つ目は複製先のディレクトリになります。一方、誰かが -f と入力した場合、スクリプトは 1 つの引数、つまりファイル名だけを取得する必要があります。次に、ファイルを1行ずつ読み取り、ファイル内のgit urlごとにgitのクローン作成と更新を行います。
スクリプトを実行すると、各オプションに対して次のエラー メッセージが表示されます。オプションを指定せずに呼び出した場合、または有効なオプションの後に他の引数を指定して呼び出した場合でも、何もせず、次の値が返されます。
./gitupdate.sh: option requires an argument -- g
私のコードでは何とか $2 と $3 を使用していないと思います。しかし、-h を渡すと、ヘルプ関数を呼び出してメッセージを表示するだけで済み、他の引数を使用する必要はありません。
問題は、 getopts を使用してユーザーが指定したオプション名を取得する下部に何か問題があるためだと思います。私のコードでは、オプションは最初の引数 $1 であり、2 番目の $2 は指定されたオプションに応じて URL またはファイル名であり、$3 は -g オプションでのみ機能するオプションの引数であると想定しています。
以下に私のコードを見つけることができます:
#!/bin/bash
declare default_directory=$HOME
declare action
declare src
function clone_repo() {
if [ -n "$2" ]; then
if [ "$(ls -A "$2" 2>/dev/null)" ]; then
cd "$2"
else
git clone "$1" "$2"
fi
else
git clone "$1"
#TODO: Get the directory name created by cloning
# and cd to it.
fi
git remote add upstream "$1"
git fetch upstream
}
function read_repos_from_file() {
if [ -f "$1" ]; then
while read -r line; do
clone_repo "$line" "$2"
done < "$1"
else
echo -e "Error: The specified file could not be found."
exit 1
fi
}
while getopts "f:h:r" option
do
case "${option}" in
f) action=read_repos_from_file; src="$OPTARG";;
g) action=clone_repo; src="$OPTARG";;
h) help ; exit 1 ;;
esac
done
shift $((OPTIND-1))
[ -z "$action" ] && ( help; exit 1 )
誰かが私を助けることができれば、私はうれしいです.
編集:上記のコードのいくつかのタイプミスを修正しました。エラーメッセージを更新しました。スクリプトが正しく動作しません。コードを何か変更して何かを実行させ、実際に $2 と $3 の引数を取得する必要があると思います。-h オプションが渡された場合、ヘルプメッセージも表示されず、以前に作成したヘルプ関数を呼び出すだけです。どうにかして getopts の部分を変更する必要があるかもしれません。
EDIT 2:アドバイスされた変更を行い、上記のコードを変更しました。