Bash - 非常简单的脚本将输出重定向到文件

时间:2015-10-19 19:30:16

标签: bash io-redirection

免责声明:我对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部分,那么它似乎工作正常。谁能告诉我这里发生了什么?我正在清除遗漏的东西非常简单。

1 个答案:

答案 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

注意:

  1. 最好不要对shell变量使用全部大写。系统对其变量使用全部大写,您不希望意外覆盖变量。使用小写或混合大小写你将是安全的。

  2. 文件名(例如$file)应始终使用双引号。有一天,有人会给你一个文件名,里面有一个空格,你不希望这会导致你的剧本失败。

  3. 命令替换$(...)不属于此处。它已被删除。