我有一个.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循环。我想我的语法或其他东西出了问题。感谢您的帮助。
答案 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