管道 awk 命令可作为单行命令工作,但不能循环运行

管道 awk 命令可作为单行命令工作,但不能循环运行

我的脚本中有一部分无法按预期运行。它应该获取以换行符分隔的剧集路径列表,格式为“/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv”(列表文件中包含引号),通过 mediainfo 运行这些文件并将 UID 附加到每一行。

我可以使用一行代码获取 UID

/volume1/@appstore/nzbdrone/bin/mediainfo "/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv" | grep Unique | awk '{print $4}'

但是,当执行以下代码时:

while read line; do
echo $line
/volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}' > $WorkingDir/output2.txt
echo `/volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}'`
var1=`echo /volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}'`
echo $var1
done < $WorkingDir/output.txt

我得到以下输出:

"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"

我知道这不会将 UID 附加到我想要的位置,这只是调试的尝试。我希望每个 echo $line 之间的两个空白行中至少有一个包含 UID。我不知道哪里出了问题 :/

(在 Synology DS412+ 上的 bash 下运行)

答案1

双引号被读入line变量并作为参数的一部分传递给mediainfo。我不喜欢使用read读取整行,而更喜欢使用命令line

您应该从输入中删除引号,而使用:-

while line=`line`; do
. . . . . .
/volume1/@appstore/nzbdrone/bin/mediainfo "$line" | grep Unique | awk '{print $4}' > $WorkingDir/output2.txt
. . . . . .

您应该对所有的实例进行双引号$line,而不仅仅是在我所显示的行中。

请注意,line准确读取行,包括删除的前导和尾随空白read

相关内容