Bash脚本,用于检测给定参数的类型

时间:2010-12-09 17:29:41

标签: bash scripting

我有一个bash脚本,它将采用一个参数:产品ID。产品ID可以采用以下两种格式之一:所有数字,或字母,数字和下划线的混合。根据输入的ID类型,脚本将以稍微不同的方式处理它。

现在,我正在使用getopts为每个子类型添加一个标志,以区分我将在脚本中使用哪种类型的产品ID。例如:

./myscript -n 1034596

./myscript -v AB_ABCD_12345

脚本的简化版本如下所示:

#!/bin/bash
while getopts ":n:v:" opt; do
  case $opt in
    n)
      echo "This is a numbers only ID." >&2
      ;;
    v)
      echo "This is a letters, numbers, underscore ID" >&2
      ;;
  esac
done

由于格式是静态的,也就是说,第一种类型的ID永远不会是数字,有没有办法自动区分这两种类型的ID并适当地处理它们而不需要{{1} }或-n标志?所以,我可以输入-v并且脚本会知道,因为参数只包含数字,所以它应该以特定的方式处理它。

8 个答案:

答案 0 :(得分:5)

#!/bin/bash

shopt -s extglob

case "$1" in
  +([0-9]) ) echo "This is a numbers only ID." >&2
    ;;
  +([a-zA-Z0-9_]) ) echo "This is a letters, numbers, underscore ID" >&2
    ;;
  *) echo "Unrecognized Product ID" >&2
esac

答案 1 :(得分:4)

Pure Bash 3.X

#!/bin/bash
if [[ "$1" =~ ^[0-9]+$ ]]; then
  echo "This is a numbers only ID." >&2
else
  echo "This is a letters, numbers, underscore ID" >&2
fi

输出

$ ./argtype.sh 1034596
This is a numbers only ID.
$ ./argtype.sh AB_ABCD_12345
This is a letters, numbers, underscore ID

答案 2 :(得分:3)

试试这段代码:

#!/bin/bash
if [ $1 -eq $1 2> /dev/null ]; then
    echo number
else
    echo not number
fi

您输入的输出是:

brent@battlecruiser:~$ ./test2 1034596
number
brent@battlecruiser:~$ ./test2 AB_ABCD_12345
not number

答案 3 :(得分:2)

有一个perhaps slightly more readable way with bash,但这可以在纯粹的便携式sh中完美合理地完成。

unset LC_COLLATE
case $1 in
  *[!0-9A-Z_a-z]*) echo 1>&2 "Invalid product ID"; exit 2;;
  *[!0-9]*) echo "alphanumeric product ID";;
  *) echo "numeric product ID";;
esac

答案 4 :(得分:1)

看一下接受this question的答案。第8行是一种你可以适应的正则表达式技术。

答案 5 :(得分:1)

#!/bin/sh

arg="$1"
output=`echo "$1" | grep -o "[0-9]\+"`
if [ "$output" == "$arg" ]; then
  echo "Numbers only"
else
  echo "Mixed"
fi

答案 6 :(得分:1)

您可以使用grep验证传入的字符串是否为数字:

#!/bin/bash
echo $1 | grep -q "^[0-9]*$"
if [ $? ]; then
    echo "Number"
else
    echo "Not a number"
fi

评论更新:

#!/bin/bash

if grep -q "^[0-9]*$" <<< "$1"; then
    echo "Number"
else
    echo "Not a number"
fi

答案 7 :(得分:1)

在Bash 3.2或更高版本中:

pattern1='^[0-9]+$'
pattern2='^[0-9a-zA-Z_]+$'
if [[ $1 =~ $pattern1 ]]
then
    echo "argument consists only of digits and is validated"
else
    echo "argument contains other characters"
    if [[ $1 =~ $pattern2 ]]
    then
        echo "argument is validated"
    else
        echo "argument contains invalid characters"
    fi
 fi