我有一个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
并且脚本会知道,因为参数只包含数字,所以它应该以特定的方式处理它。
答案 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)
#!/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