while .sh文件中的循环,条件是比较字符串是否包含子字符串

时间:2015-08-07 05:32:57

标签: bash shell

我有一个.sh文件,其中我编写了以下函数。调用此函数的命令将包含参数 - file1.war file2.war ... fileN.war 和其他参数。

我想对.war文件执行某项操作,然后为其后的参数执行其他操作。所以我编写了一个while循环,它将运行直到参数为.war个文件,并且当遇到没有。war扩展的参数时,它将退出循环并在其下面运行代码论证。

这是.sh文件中的函数:

copyWarFiles()
{
downloadFileName=$1
    shift 1
extn=".war"
while [ condition ]
do      
        log "war file $downloadFileName .."
         #some operation..
        downloadFileName=$1
        shift 1
done
#operations for the rest of the arguments...
}

如果$ downloadFileName以.war结尾,我应该给出什么条件才会返回true?我试过给 $downloadFileName==*".war"(根据this中接受的答案) 我也尝试过这个:

`test "${downloadFileName#*$extn}" != "$downloadFileName"` 

(遵循接受的答案here)其中 extn 是我声明并分配给.war的另一个变量。

但在这两种情况下,我都看到它永远不会进入while循环。我想我的语法或其他东西出了问题。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

  

如果$ downloadFileName以“.war”结尾,我应该作为条件返回true?我试着给$downloadFileName==*".war" [...]

与典型的编程语言不同,Bash不会将==识别为特殊运算符;它只是[命令的另一个参数。所以你需要用空格来设置它。

此外,[命令不支持在==的右侧设置模式;您需要使用特殊的[[ ... ]]表示法。

所以:

while [[ $downloadFileName == *".war" ]]

请注意,.war周围的双引号实际上没有任何效果:.war中的所有字符都不是需要引用的特殊字符。相反,如果变量包含特殊字符,最好将变量扩展放在双引号中。 ([[实际上否定了大多数有问题的行为,但这只是一个好习惯。)

所以:

while [[ "$downloadFileName" == *.war ]]

答案 1 :(得分:1)

为什么不呢:

check=`echo $downloadFile | grep '\.war'`
if [ -n "$check" ]; then
    echo $downloadFile ends in .war
fi