如何在 bash 中使用变量加 glob ($var*)

如何在 bash 中使用变量加 glob ($var*)

我的脚本有问题。

这就是代码

#!/bin/bash

date=`date +"%m-%d-%y"`

dokuwiki="dokuwiki.$date*.toolbox.admin.tar.gz"

if test -e  $dokuwiki
then
echo "works"
else
echo "shits broken yo"
fi

我的问题,我认为它找不到奇怪的文件

文件是这样的:

dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz

干杯

答案1

引号阻止 * 执行 glob 来匹配文件。如果只有一个文件需要修补,则只需删除引号即可;否则你必须修改脚本来处理扩展中的多个文件名,例如

for filename in $dokuwiki; do
    # do something with $filename
done

答案2

问题是星号 ( *) 扩展是由 bash 完成的。

带有一个 doku* 文件

mybox $ touch dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz
mybox $ date=`date +"%m-%d-%y"`
mybox $ echo $date
09-12-14
mybox $ dokuwiki="dokuwiki.$date*.toolbox.admin.tar.gz"
mybox $ echo $dokuwiki
dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz
mybox $ test -e $dokuwiki ; echo $?
0

有两个 docu* 文件

mybox $ touch dokuwiki.09-12-14-05-00.toolbox.admin.tar.gz
mybox $ test -e $dokuwiki ; echo $?
-bash: test: dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz: binary operator expected
2

该行test -e doku*扩展为test -e doku-1 doku2.

你可能希望使用

if ls $dokuwiki > /dev/null  2>&1 
then
   ...

作为测试部分。

答案3

如果你像这样使用 if 中的存在

if [ -e $docuwiki ]
then
    echo "works"
else
    echo "broken"
fi

会起作用的。如下所述,if 语句是等效的。从问题中重新复制后,我认为这实际上是变量 docuwiki 的问题,因为我无法正确回显,手动重写它有帮助。

相关内容