【问题标题】:Echo variable from csv with string using a bash script in terminal使用终端中的 bash 脚本从 csv 中回显变量和字符串
【发布时间】:2020-04-15 18:43:38
【问题描述】:

我相信有一些类似的帖子,如果我在这方面做得更好,我可以找出我自己问题的答案(This onethis one)。

我有一台 Mac,并且正在使用终端中的 setfile 命令,该命令对单个文件非常有效。

setfile -d "08/02/2001 00:00:00" X-09-04.m4v

但是,我有数百个视频可以处理。我有一个文件 changedate.csv 文件,其中所有日期和相关文件名位于两个单独的列中(屏幕截图)。 csv 格式如下:

datenew,id
12/19/1998 12:00:00 AM,X-01/X-01-01.m4v
12/31/1998 12:00:00 AM,X-01/X-01-02.m4v
12/31/1998 12:00:00 AM,X-01/X-01-03.m4v

然后我创建了 changedate.sh 脚本,如下所示:

#!/bin/bash
cat changedate.csv | while IFS=, read datenew id;
do
    echo 'setfile -d "$datenew" $id'
done

命令 setfile 要求日期字符串需要用引号引起来。这让我很困惑,因为当我从终端运行 sh changedate.sh 脚本时,它会打印出来如下:

setfile -d "$datenew" $id
setfile -d "$datenew" $id
setfile -d "$datenew" $id
....

如果我删除变量周围的引号,它会正确读取 csv,输出如下所示:

setfile -d 12/19/1998 00:00:00  X-01/X-01-01.m4v
setfile -d 12/31/1998 00:00:00  X-01/X-01-02.m4v
setfile -d 12/31/1998 00:00:00  X-01/X-01-03.m4v
...

这几乎是正确的,但它不起作用,因为日期字符串没有用引号括起来,这是必需的。最终输出应如下所示:

setfile -d "12/19/1998 00:00:00"  X-01/X-01-01.m4v
setfile -d "12/31/1998 00:00:00"  X-01/X-01-02.m4v
setfile -d "12/31/1998 00:00:00"  X-01/X-01-03.m4v
...

我想我需要使用反斜杠来让变量与引号一起打印,但我不太明白。感谢您的帮助!

【问题讨论】:

  • 为什么要回显setfile 命令而不是执行它?
  • setfile 本身不需要(或看到)引号;这些只是为了保护日期和时间之间的空间不被分词。如果您打算实际运行该命令,setfile -d "$datenew" "$id" 就是您所需要的。

标签: bash csv variables terminal escaping


【解决方案1】:

变量只在双引号内展开,而不是单引号。所以你需要在echo的参数两边加上双引号。

echo "setfile -d '$datenew' '$id'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2021-12-02
    • 2015-12-18
    • 1970-01-01
    • 2021-09-22
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多