我尝试测试一个字符串是否以某个前缀开头。但我的脚本似乎不起作用(我希望“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.
$
答案 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;
备注:强>
答案 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