我正在编写一个 bash 脚本来自动化一些工作,同时练习 bash。我正在编写一个脚本来自动化一些 git 克隆和更新的东西。我的脚本将具有三个选项(-g、-f、-h)。当有人键入 -h 时,它应该显示帮助消息(我已经写过但在下面省略了),当有人写 -g 时,它应该接受至少一个参数,但它也可以接受第二个作为可选参数。其中,第一个将是要克隆的存储库的 url,第二个将是目录,克隆它的位置。另一方面,如果有人键入 -f,脚本应该只得到一个参数,只是一个文件名。然后我想逐行读取文件,并对文件中的每个 git url 进行 git 克隆和更新。
如果我运行脚本,我会为每个选项收到以下错误消息,如果我在没有任何选项的情况下调用它,或者在一个有效选项后跟一些其他参数的情况下调用它,它仍然不执行任何操作,只是返回:
./gitupdate.sh: option requires an argument -- g
我想它不会在我的代码中以某种方式使用 $2 和 $3 。但是话又说回来,当我通过 -h 时,它所要做的就是调用帮助函数并显示消息,不需要使用任何其他参数。
我想问题是因为我在底部有问题,我使用 getopts 来获取用户指定的选项名称。在我的代码中,我假设选项是第一个参数 $1,然后第二个参数 $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 部分。
编辑 2:进行了建议的更改,并更改了上述代码。