0

我尝试测试一个字符串是否以某个前缀开头。但是我的脚本似乎不起作用(我希望“if”分支不会运行)。一些 Bash 专家可以帮忙看看吗?谢谢!

这是我的代码和测试结果:

$ 猫 testb.bash

#!/bin/bash

my_var="abcdefg";
if [[ "${my_var:0:5}"=="order" ]]; then
    echo "value of my_var is ${my_var}.";
fi;

if [[ "${my_var:0:5}" -eq "order" ]]; then
    echo "value of my_var is ${my_var}.";
fi;

if [ "${my_var:0:5}"="order" ]; then
    echo "value of my_var is ${my_var}.";
fi;

$ bash -x testb.bash

+ my_var=abcdefg
+ [[ -n abcde==order ]]
+ echo 'value of my_var is abcdefg.'            
value of my_var is abcdefg.
+ [[ abcde -eq order ]]
+ echo 'value of my_var is abcdefg.'
value of my_var is abcdefg.
+ '[' abcde=order ']'
+ echo 'value of my_var is abcdefg.'
value of my_var is abcdefg.
$
4

4 回答 4

2

要测试子字符串的存在,您可以使用以下任何一种:

if [[ "$j" =~ string1 ]]; then
if [[ $j == *string1* ]]; then

在您的特定情况下,您错过了一个空间 surrounding ==,所以不是

if [[ "${my_var:0:5}"=="order" ]]; then

它应该是

if [[ "${my_var:0:5}" == "order" ]]; then
                     ^  ^

最后,请注意,您的条件被评估为 true,因为它正在评估if [ "string" ],如果string不为空,则为 true:

$ [ "a" ] && echo "yes"
yes

测试

$ cat a
#!/bin/bash

my_var="abcdefg";
if [[ "${my_var:0:5}" == "order" ]]; then
    echo "value of my_var is ${my_var}."
elif [[ "${my_var:0:5}" == "abcde" ]]; then
    echo "yeahaa"
else
    echo "is not"
fi

$ ./a
yeahaa
于 2013-10-19T23:08:43.957 回答
2

在这种情况下,空格很重要。正如您在-x输出中看到的,它将第一个条件理解为

[[ -n "${my_var:0:5}==order" ]]

此外,要测试前缀,您可以使用模式:

[[ $my_var == order* ]]
于 2013-10-19T23:10:28.330 回答
1

好的,我测试了你的代码,你应该像下面的代码:

prefix="pre_order";
pre="pre_"
len=${#pre}
echo $len
if [[ "${prefix:0:len}" == "blahvlah" ]] ;  then
 echo "dddd"
fi;

笔记:

  1. 使用 == 进行字符串比较
  2. 对于 ${} 你应该在 ${} 之前初始化一个字符串变量
  3. 使用 len=${#pre} 作为字符串的长度。
于 2013-10-19T23:29:45.413 回答
0

测试前缀的符合 POSIX 标准的方法是尝试删除前缀,并将结果与​​原始字符串进行比较。如果两者相同,则前缀不存在,删除失败,表达式扩展为原始字符串。

prefix=foo
string=foobar

if [ "${string#$prefix}" = "$string" ]; then
    printf "$string does not start with $prefix\n"
else
    printf "$string starts with $prefix\n"
fi
于 2013-10-20T15:08:42.800 回答