例如string = "test test test"
我想在找到字符串中出现任何空格后,它应该回显错误并退出其他进程。
答案 0 :(得分:2)
case
语句在这种情况下很有用:
case "$string" in
*[[:space:]]*)
echo "argument contains a space" >&2
exit 1
;;
esac
处理前导/尾随空格。
答案 1 :(得分:1)
对于纯粹的Bash解决方案:
function assertNoSpaces {
if [[ "$1" != "${1/ /}" ]]
then
echo "YOUR ERROR MESSAGE" >&2
exit 1
fi
}
string1="askdjhaaskldjasd"
string2="asjkld askldja skd"
assertNoSpaces "$string1"
assertNoSpaces "$string2" # will trigger error
"${1/ /}"
删除输入字符串中的任何空格,如果没有空格,则与原始字符串进行比较时应完全相同。
请注意"${1/ /}"
周围的引号 - 这可确保考虑前导/尾随空格。
要匹配多个字符,您可以使用regular expressions定义匹配的模式 - "${1/[ \\.]/}"
。
更好的方法是使用进程内表达式匹配。由于没有进行字符串操作,它可能会快一点。
function assertNoSpaces {
if [[ "$1" =~ '[\. ]' ]]
then
echo "YOUR ERROR MESSAGE" >&2
exit 1
fi
}
有关=~
运算符的详细信息,请参阅this page和this chapter in the Advanced Bash Scripting guide。
该操作符是在Bash版本3中引入的,因此请注意您是否使用旧版本的Bash。
关于评论中的问题:
如果用户输入,如何处理代码 像“asd”一样意思是双引号 ......我们能处理吗??
上面给出的函数应该适用于任何字符串,因此它将取决于您从用户那里获得输入的方式。
假设您正在使用read
命令来获取用户输入,您需要注意的一件事是默认情况下反斜杠被视为转义字符,因此它不会像您期望的那样运行。 e.g。
read str # user enters "abc\"
echo $str # prints out "abc", not "abc\"
assertNoSpaces "$str" # no error since backslash not in variable
要解决此问题,请使用-r
选项将反斜杠视为标准字符。有关详细信息,请参阅read MAN Page。
read -r str # user enters "abc\"
echo $str # prints out "abc\"
assertNoSpaces "$str" # triggers error
答案 2 :(得分:0)
您可以将grep
用作:
string="test test test"
if ( echo "$string" | grep -q ' ' ); then
echo 'var has space'
exit 1
fi
答案 3 :(得分:0)
有多种方法可以做到这一点;使用参数扩展 你可以这样写:
if [ "$string" != "${string% *}" ]; then
echo "$string contains one or more spaces";
fi
答案 4 :(得分:0)
双括号内的==
运算符可以匹配通配符。
if [[ $string == *' '* ]]
答案 5 :(得分:-1)
我在处理路径时遇到了一个非常相似的问题。我选择依靠外壳程序的参数扩展,而不是专门寻找空间。但是,它不会检测到前端或后端的空格。
function space_exit {
if [ $# -gt 1 ]
then
echo "I cannot handle spaces." 2>&1
exit 1
fi
}