bash脚本如何扩展文件全局?

bash脚本如何扩展文件全局?,bash,tar,glob,Bash,Tar,Glob,在这段代码中,excludespec变量预期会匹配它的所有子字符串,但它似乎会在执行时对匹配它的实际文件求值,而不是使用它将其精确表示形式传递给tar命令 excludespec=${PWD##*/}\\\$USER\`hostname`.bkcd\u备份* 最终结果是创建的存档与排除列表不匹配,因此tar输出: tar::文件在读取时发生了更改 定义它的字符串是否在做我不知道的事情 代码如下: #!/bin/sh # bkcd - backup current directory in si

在这段代码中,
excludespec
变量预期会匹配它的所有子字符串,但它似乎会在执行时对匹配它的实际文件求值,而不是使用它将其精确表示形式传递给tar命令

excludespec=${PWD##*/}\\\$USER\`hostname`.bkcd\u备份*
最终结果是创建的存档与排除列表不匹配,因此tar输出:

tar::文件在读取时发生了更改

定义它的字符串是否在做我不知道的事情

代码如下:

#!/bin/sh
# bkcd - backup current directory in situ

DMY_M() {
  date +%Y%m%d_%H%M
}

timestring=$(DMY_M)
echo `pwd` - $timestring > .bkcdspec  
filename=${PWD##*/}\_$USER\_`hostname`.bkcd_backup.$timestring.tar.gz    
excludespec=${PWD##*/}\_$USER\_`hostname`.bkcd_backup*
fullexclude="$excludespec"tar.gz    
echo excludespec - $excludespec
echo filename - $filename
echo fullexclude - $fullexclude    
tar -cpzf $filename --exclude=$fullexclude .
rm .bkcdspec

抑制globbing的常用技巧是将字符串括在双引号中(当需要展开反勾号或变量时)或单引号中(当不需要展开时)。因此,在这里,您需要消除
$excludespec
并设置
$fullexclude

fullexclude="${PWD##*/}_${USER}_$(hostname).bkcd_backup*.tar.gz"
并将其用作:

tar -cpzf "$filename" --exclude="$fullexclude" .
(如果
“$fullexclude”
周围没有双引号,如果您碰巧有一些文件名为
--exclude=…value of-$fullexclude
,您会感到惊讶。您不太可能有这样的文件,但您最好在问题出现之前避免它。)

请注意,当您回音进行调试时,停止globbing也是至关重要的;同样,双引号:

echo "filename=$filename"
echo "fullexclude=$fullexclude"   
否则,
echo
会对名称进行全局扩展,再次让您感到困惑

将这些变化放在一起会导致:

#!/bin/sh
# bkcd - backup current directory in situ

timestring=$(date +%Y%m%d_%H%M)
echo "$(pwd) - $timestring" > .bkcdspec
prefix="${PWD##*/}_${USER}_$(hostname).bkcd_backup"
filename="$prefix.$timestring.tar.gz"   
fullexclude="$prefix.*.tar.gz"
echo "filename - $filename"
echo "fullexclude - $fullexclude"   
tar -cpzf "$filename" --exclude="$fullexclude" .
rm .bkcdspec
你不需要