Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:如何将变量用作带有多组引号的参数_Bash_Variables_Loops_Escaping_Eyed3 - Fatal编程技术网

Bash:如何将变量用作带有多组引号的参数

Bash:如何将变量用作带有多组引号的参数,bash,variables,loops,escaping,eyed3,Bash,Variables,Loops,Escaping,Eyed3,我有一个满是MP3的文件夹,我想去掉所有id3用户文本框(除了replaygain)——我写的这段代码可以做到,但它会在每个文件中循环找到每个标记,以删除它。这导致脚本在每个mp3上循环多次,以完成我想要的任务 以下是有效的代码: #!/usr/bin/env bash userframes=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -

我有一个满是MP3的文件夹,我想去掉所有id3用户文本框(除了replaygain)——我写的这段代码可以做到,但它会在每个文件中循环找到每个标记,以删除它。这导致脚本在每个mp3上循环多次,以完成我想要的任务

以下是有效的代码:

#!/usr/bin/env bash
userframes=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq`

SAVEIFS=$IFS
IFS=$'\n'
for f in $userframes; do
    eyeD3 --user-text-frame="$f:" *.mp3
done
IFS=$SAVEIFS
我希望更有效地将变量中的每个条目针对每个mp3使用一次,如下所示:

eyeD3 --user-text-frame="desc1:" --user-text-frame="desc2:" *.mp3
frames=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq | sed -e "s|'|"'\\\'"'|g" | awk '{print "--user-text-frame=\x27" $0 ":\x27"}' | sed ':a;N;$!ba;s/\n/ /g'`

eyeD3 $frames *.mp3
但我不知道怎么做。我想我通过尝试在一个变量中使用开关一次创建所有列表,但有一些奇怪的字符转义问题我无法解决

eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq | sed -e "s|'|"'\\\'"'|g" | awk '{print "--user-text-frame=\x27" $0 ":\x27"}' | sed ':a;N;$!ba;s/\n/ /g'
这样的列表(我尝试了双引号而不是单引号,并转义了双引号):

但我无法成功地将其作为变量传递给eyeD3,如下所示:

eyeD3 --user-text-frame="desc1:" --user-text-frame="desc2:" *.mp3
frames=`eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | awk -F ":" '{print $3}' | sed 's/]//g' | sed -e 's/^[ \t]*//' | sed 's/\s*$//g' | sort | uniq | sed -e "s|'|"'\\\'"'|g" | awk '{print "--user-text-frame=\x27" $0 ":\x27"}' | sed ':a;N;$!ba;s/\n/ /g'`

eyeD3 $frames *.mp3
我要么得到一个错误

"eyeD3:错误:无法识别的论点:信用证:'专辑艺术家Id:'专辑Id:'专辑发行国:'专辑状态:'专辑类型:'艺术家Id:'发行组Id:'01-做快乐。mp3 02-爱。mp3 03-所以光是她的脚。mp3 04-做蜜蜂。mp3 05-错过白天的光。mp3 06-热带疾病。mp3 07-天堂的光。mp3 08-夜晚Hunter.mp3 09-唱歌。mp3 10-吃我的节拍。mp3 11-你可以告诉每个人。mp3 12-非洲丝绒。mp3“

或者,如果我尝试使用转义引号,我会在现有标记的基础上添加更多重复标记,如

'tag
tag
它曾经在哪里

tag
也许有更简单的方法来做我想做的事

编辑:

根据帮助,eyeD3命令的语法如下:

--user-text-frame DESC:TEXT
                    Set the value of a user text frame (i.e., TXXX). To
                    remove the frame, specify an empty value. e.g.,
                    --user-text-frame='SomeDesc:'
例如:

eyeD3 --user-text-frame='ALBUMARTISTSORT:' *.mp3
应该从该目录中的所有MP3中删除带有说明ALBUMARTISTSORT的用户文本框标记

eyeD3的典型输出是一个文件(输入*mp3只会为dir中的所有mp3生成多个条目)


请在变量周围加一对双引号

eyeD3 "$frames" *.mp3

我会用像这样的东西

regex='UserTextFrame: [Description: (.*)]'
eyeD3 *.mp3 | grep UserTextFrame | grep -v replaygain | while read; do
    [[ $REPLY =~ $regex ]] && echo "${BASH_REMATCH[1]}"
done | sort -u | while read frame; do
    eyeD3 --user-text-frame "$frame:" *.mp3 
done

管道的前三个阶段与您的相同“,直至闭合支架。这个while循环的输出包括所有mp3上的所有描述。这是通过
sort-u
来消除重复项,然后送入另一个
,而
循环从所有MP3中删除每个唯一项。

eyeD3不会抛出错误,但也不会执行任何操作。标记保持不变。请发布
eyeD3
命令的原始输出。考虑到输出中存在空白,您必须放弃将整个输出存储在单个变量中的方法。如果我们能看到如何正确解析数组,那么使用数组可能是可行的。您想知道命令“-user text frame DESC:text”的语法吗?我已经在上面的主要帖子中添加了这一点。如果您还需要更多信息,请告诉我。添加了eyeD3输出示例。运行该示例时,我不会得到任何输出,标记也不会更改。“--user text frame DESC:”应该是“-user text frame=DESC:”以删除标记,因此我在其中添加了“=”,但结果相同。要使代码正常工作:[这与我最初发布的for循环的作用相同。它在每个mp3中反复循环,一次删除一个标记。我希望每个mp3一次删除所有标记。这只能通过添加多个“-user text frame DESC:text”参数来完成