Bash 如果用户输入中至少有一个引号,则测试将中断

Bash 如果用户输入中至少有一个引号,则测试将中断,bash,shell,if-statement,Bash,Shell,If Statement,如果用户输入包含一个单引号,如 $ echo "Hello my name Foo I'm 18" | ./test.sh 它失败,出现错误语法错误:应为操作数(错误标记为“')) 代码: #/垃圾箱/垃圾箱 读行时 做 str=$line for((i=0;i

如果用户输入包含一个单引号,如

$ echo "Hello my name Foo I'm 18" | ./test.sh
它失败,出现错误
语法错误:应为操作数(错误标记为“'))
代码:

#/垃圾箱/垃圾箱
读行时
做
str=$line
for((i=0;i<${str};i++)
做
如果[[“${str:$i:1}”-gt 4]您可以使用:

#!/bin/bash

while read -r line; do
    str=$line
    for ((i = 0; i < ${#str}; i++)); do
        ch="${str:$i:1}"
        if [[ $ch == [0-9] && $ch -gt 4 ]]; then
            echo 'foo'
        elif [[ $ch == [0-9] && $ch -lt 4 ]]; then
            echo 'bar'
        else
            echo 'not a number'
        fi
    done
done
#/bin/bash
而read-r行;做
str=$line
对于((i=0;i<${str};i++);做
ch=“${str:$i:1}”
如果[[$ch==[0-9]&&$ch-gt 4];然后
回声“foo”
elif[[$ch==[0-9]&&&ch4];然后
回音“条”
其他的
回音“不是数字”
fi
完成
完成
  • 使用
    /bin/bash
    代替
    /bin/sh
  • 在使用
    -gt
    -lt
    运算符之前,请使用
    $ch==[0-9]
    检查字符是否为数字,以避免预期的操作数错误

您的意思是“恰好一个单引号”还是“至少一个单引号”?Jubobs已更正,感谢问题是
-gt
-lt
需要整数参数,如果参数是有效标识符(如
H
e
等),则将其扩展为参数。在大多数情况下,这些参数不存在,计算结果为0(因此,大量的
条形图
输出。
'
不是有效的参数名称,因此您会遇到一个错误。但是,为什么您要首先尝试将字符串与整数进行比较?我认为您需要解释您正试图完成的操作,以便正确修复它。在我看来,这可能会提供错误的结果例如,如果输入为
18
(您也可以使用简单模式检查
$i
是否为数字:
$i!=*[!0-9]*
#!/bin/bash

while read -r line; do
    str=$line
    for ((i = 0; i < ${#str}; i++)); do
        ch="${str:$i:1}"
        if [[ $ch == [0-9] && $ch -gt 4 ]]; then
            echo 'foo'
        elif [[ $ch == [0-9] && $ch -lt 4 ]]; then
            echo 'bar'
        else
            echo 'not a number'
        fi
    done
done