bash 中的脚本参数

bash 中的脚本参数

我正在开发一个需要两个脚本参数并将它们用作脚本中的变量的脚本。我无法让这个工作,也无法找出我做错了什么。我看到问题是第二个参数,正如我在一些测试中看到的那样(如本文底部所述),它没有被读取。

这是代码:

    #!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

注意:我根据本中的第三个答案对我的代码进行了建模

如何将命令行参数传递到 shell 脚本中?

我发现问题出在第二个变量(-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

相关内容