关于Bash子串比较

时间:2013-10-19 23:03:16

标签: bash

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

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

$ cat 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 个答案:

答案 0 :(得分:2)

要测试子字符串是否存在,您可以使用以下任一方法:

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

在您的特定情况下,您错过了==的空格,而不是

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

应该是

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

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

$ [ "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

答案 1 :(得分:2)

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

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

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

[[ $my_var == order* ]]

答案 2 :(得分:1)

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

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

备注:

  1. use == for string comparation
  2. for $ {}你应该在$ {}
  3. 之前初始化一个字符串变量
  4. 使用len = $ {#pre}来获取字符串长度。

答案 3 :(得分: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