$1 $2
我从命令行获得了脚本的几个参数 ( )。
我一直在尝试测试它们,以确保输入的值不是垃圾:
if [ $1 ]; then
INPUT=$1
if [[ -n ${INPUT//[0-9]/} ]]; then
即:我试图确保它$1
不为空,并且由 0-9(数字)组成,即有人没有输入script string more_strings
或简单的、无参数的script
而不是类似的东西script 12 321
但随后尝试将$INPUT
(我也尝试过 $1)视为整数:
if [ $INPUT -gt 100 ]; then
INPUT=100
fi
失败了,通过回显测试,看起来我有一个字符串(即使我使用了 gt - 我认为这意味着将其评估为整数?),并且我不确定如何将其/评估 $1 为一个整数?
http://mywiki.wooledge.org/BashFAQ/054
建议我这样做:
if [[ $1 != *[!0-9]* ]]; then
但我不明白那里发生了什么。不等于不0-9???为什么 *?
这看起来很有趣:
declare -i $1
但似乎永久改变了 1 美元?直到重新分配?
我想知道如何测试我的输入,以确保它们是 A) 字符串或 B) 数字/整数 - 然后如何在我的脚本中使用它们(或如何转换它们)。最好有解释。
我尝试对之前的问题进行一些搜索,但显然我搜索的是错误的术语 - 因为这似乎是一件非常基本的事情,我已经忘记了如何做/应该已经在其他地方得到了回答。
这里也没有找到:
https://ss64.com/bash/test.html
也许需要睡觉时间。
答案1
在 中[[ .. ]]
,=
运算符实际上是模式匹配,因此[[ $1 != *[!0-9]* ]]
测试 的值是否$1
与模式不匹配*[!0-9]*
。
这里使用的模式与文件名扩展的模式相同,因此*
匹配任何字符、[abc]
括号之间的任何字符和[!abc]
/或[^abc]
任何字符不是括号之间(不包括开头的!
或^
)。实际上,它测试是否$1
包含一些不是0
to中的数字的字符9
。
declare -i var
会将变量标记var
为整数变量:对它的赋值将被解释为在算术上下文中,因此declare -i a; a=3+5; echo $a;
将输出8
。但你不能在位置参数上使用它,例如$1
.相反,declare -i $1
会采用包含在中的字符串$1
并使用那作为变量名。 (注意$
上面没有declare -i a
。)
您不能真正用来declare -i
测试某物是否是数字,因为算术上下文中的字符串被视为变量名字。这不是一个错误:declare -i a; b=1+2; a=b; echo $a;
。相反,它打印3
,这可能是也可能不是您想要的。
答案2
检查是否有输入,然后是否是数字(1 位或更多位),我使用了这个全局:
if [ $2 ]; then INPUT=$2 if [[ $INPUT = +([[:digit:]]) ]]; then
这似乎正在测试非数字输入:
if [[ -n ${INPUT//[0-9]/} ]]; then
答案3
不像 ilkkachu 那样有一个很好的解释
但你可以尝试这个方法
[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"