在终端中使用bash脚本使用字符串从csv中回显变量

时间:2019-12-24 19:44:04

标签: bash csv variables terminal escaping

我相信也有一些类似的帖子,如果我对此做得更好,我可以找出我自己的问题(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要求日期字符串需要用引号引起来。这就是让我感到困惑的原因,因为当我从终端运行 shchangedate.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
...

我认为我需要使用反斜杠来使变量与引号一起显示,但是我不太清楚。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

变量仅在双引号内而不是单引号内扩展。因此,您需要在echo的参数周围加上双引号。

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