繁体   English   中英

检测参数数量和传递给bash的值

[英]Detect number of argument and the value passed into the bash

我想确保我的bash脚本可以正确检测用户的输入参数。 具体来说,用户只能将1或2或3传递给脚本,否则脚本将被终止。 我写了以下代码:

#!/bin/bash

for args in $@
do
    echo $args
done

if [ "$#" != 1 ] && [ "$#" -ne 1 ]; then
        echo "Illegal number of parameters"
        exit 1
fi

该脚本只能在用户不输入任何内容时捕获,而不能检查用户是否确实输入了数字1而不输入其他值。

顺便说一下,我不确定如何表达“输入参数可以接受数字1或2或3”。

$#是整数,因此您必须使用整数比较。 例如,您可以说:

if [ "$#" -ne 1 ]; then
   echo "illegal number of parameters"
   exit 1
fi

要检查参数是1、2还是3,可以使用以下正则表达式(请参阅相关内容 ):

if [[ ! $1 =~ ^(1|2|3)$ ]]; then
    echo "the number is not 1, 2 or 3"
    exit 1
fi

为了表达“输入参数可以接受数字1或2或3”,我可以说“我们可以接受参数是1、2或3”。

首先,您可以通过执行以下操作来检测字符串是空还是空:

if [ -z "$1" ]
  then
  echo "Argument $1 contains nothing"
fi

我想说这是您的第一步,它将允许您过滤出不包含任何内容的args。

然后,您很可能需要对$ 1,$ 2和$ 3进行一些比较工作

我将检查一下,稍后再返回。

更新

只是不得不去找到我的脚本之一并检查一下... :-)

我过去处理过Parm检查的一种方式是如下所示

#!/bin/sh
while [ $# -gt 0 ] || [ "$#" -le 4 ]; do
  case "$1" in
    *[!1-9]*)   echo "Text: $1";;
    *)          echo "Number: $1"
  esac

  case "$2" in
    *[!1-9]*)   echo "Text: $2";;
    *)          echo "Number: $2"
  esac

  case "$3" in
    *[!1-9]*)   echo "Text: $3";;
    *)          echo "Number: $3"
  esac

  shift
done

基本上是一个简单的正则表达式,如果我有0个以上的参数或4个以下的参数,则可以将其允许通过case语句,然后检查每个参数的内容。

这个只是回声,但是您可以轻松设置一些标志,然后根据这些标志决定如何继续。

但是,对于简单的范围检查,您可能只想使用类似于以下内容的一根衬管:

if [[ $# -gt 0 && $# -lt 4 ]]; then echo "Correct number of parameters"; fi

再次设置标志以供以后使用而不是回显结果。

我假设您的意思是输入只能是1、2或3,所以使用case语句是最好的方法。 $ 1是存储参数的变量,如果等于1,则将在与值1对应的块中执行代码,依此类推。

 case "$1" in
        1) ...
        ;;
        2) ...
        ;;
        3) ...
        ;;
        *) echo "Invalid argument"
        ;;
     esac

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM