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

时间:2015-05-07 10:52:34

标签: linux bash shell

我想确保我的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"。

3 个答案:

答案 0 :(得分:1)

if(country.selectedItem.Equals("US") and country.selectedItem is unchecked....)) { ....... } 是一个整数,因此您必须使用整数比较。例如,您可以说:

$#

要检查参数是1,2或3,您可以使用此正则表达式(请参阅something related):

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

要表达“输入参数可以接受数字1或2或3”,我会举例说“我们可以接受参数为1,2或3”。

答案 1 :(得分:0)

首先,您只需执行以下操作即可检测字符串是空还是空:

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

我想说的是你的第一步,并允许你过滤掉没有内容的args。

接下来,您很可能需要对1美元,2美元和1美元进行一些比较工作。 $ 3'/ P>

我只是检查一下,然后马上回来。

更新

只需要找到我的一个脚本并检查一下......: - )

过去我处理过parms检查的一种方法如下:

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

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

答案 2 :(得分:0)

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

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