免责声明:我对bash很新,出于某种原因,我很难学习这个。根据我访问的网站,语法看起来非常不同。
我有一个简单的包装器脚本,我想测试文件是否被gzip压缩,如果是,请将文件zcat转换为新的临时文件并在编辑器中打开它。这是脚本的一部分:
if file $FILE | grep -q gzip
then
timestamp=$(date +"%D_%T")
$( zcat $FILE > tmp-$timestamp )
fi
我收到错误:“tmp-10/19 / 15_15:16:41:没有这样的文件或目录”
我尝试删除命令替换语法或将tmp- $ timestamp放在双引号中,我得到了同样的错误。如果我删除 - $ timestamp部分,那么它似乎工作正常。谁能告诉我这里发生了什么?我正在清除遗漏的东西非常简单。
答案 0 :(得分:2)
tmp-10/19/15_15:16:41
引用目录15_15:16:41
中名为19
的文件,该文件是tmp-10
的子目录。如果这些目录和子目录不存在,则无法写入它们。
替换:
timestamp=$(date +"%D_%T")
使用:
timestamp=$(date +"%F_%T")
这给出了没有/
的日期。
作为这种格式的一个例子:
$ date +"%F_%T"
2015-10-19_12:37:05
使用%F
,年份出现在当天之前的月份之前。这意味着您的文件将正确排序。对于大多数人来说,这是%D
的重要优势。
您的脚本可以简化为:
if file "$file" | grep -q gzip
then
zcat "$file" > "tmp-$(date +"%F_%T")"
fi
注意:
最好不要对shell变量使用全部大写。系统对其变量使用全部大写,您不希望意外覆盖变量。使用小写或混合大小写你将是安全的。
文件名(例如$file
)应始终使用双引号。有一天,有人会给你一个文件名,里面有一个空格,你不希望这会导致你的剧本失败。
命令替换$(...)
不属于此处。它已被删除。