我正在开发一个需要两个脚本参数并将它们用作脚本中的变量的脚本。我无法让这个工作,也无法找出我做错了什么。我看到问题是第二个参数,正如我在一些测试中看到的那样(如本文底部所述),它没有被读取。
这是代码:
#!usr/bin/bash
help()
{
echo ""
echo "Usage: $0 -p patch_level -e environment"
echo -e "\t-p Patch level that you are tryin to update the server"
echo -e "\t-e Environment that the patch need to be run on"
exit 1 # Exit script after printing help
}
while getopts "p:e" opt
do
case "${opt}" in
p ) patch_level="$OPTARG" ;;
e ) _env="$OPTARG" ;;
? ) help ;; # Print help in case parameter is non-existent
esac
done
if [ -z "$patch_level" ] || [ -z "$_env" ]; # checking for null parameter
then
echo "Some or all of the parameters are empty";
help
else
echo "$patch_level and $_env"
fi
当我运行如下脚本时,我得到了这个。
> ./restart.sh -p 2021 -e sbx
> Some or all of the parameters are empty
> Usage: ./restart.sh -p patch_level -e environment
> -p Patch level that you are tryin to update the server
> -e Environment that the patch need to be run on
注意:我根据本中的第三个答案对我的代码进行了建模
我发现问题出在第二个变量(-e)上。因为如果我将最后一个 if 语句从“or”更改为“and”,脚本会运行,但不会为第二个变量打印任何内容:
这就是我要说的
if [ -z "$patch_level" ] && [ -z "$_env" ];
输出是
./restart.sh -p 2021 -e sbx
2021 and
This server will be patched to 2021
如果这很重要的话,我在 Ubuntu 上。
答案1
$_env
由于您将参数传递给 的方式而未设置getopts
。
您需要在 后面添加一个冒号e
来告诉getopts
选项需要一个参数。
while getopts "p:e:" op
^
mandatory here
查看:
help getopts | less