我是shell脚本的新手,我正在编写一个脚本来组织我的音乐库。我正在使用awk来解析id3标记信息,并生成一个换行符分隔列表,如下所示:
Kanye West
College Dropout
All Falls Down
我想将每个字段存储在一个单独的变量中,这样我就可以轻松地编写一些mkdir和mv命令。我已经尝试将输出汇总到IFS=$'\n' read artist album title
,但每个变量都保持为空。我愿意从awk生成不同的输出,但我仍然想知道如何使用bash解析换行符分隔列表。
修改
事实证明,通过执行以下操作直接向read
滚动:
id3info "$filename" | awk "$awkscript" | {read artist; read album; read title;}
不会工作。它会产生变量existing in a different scope。我发现使用herestring效果最好:
{read artist; read album; read title;} <<< "$(id3info "$filename" | awk "$awkscript")"
答案 0 :(得分:4)
read
通常一次读取一行。因此,如果您的id3信息位于文件testfile.txt
中,则可以按如下方式阅读:
{ read artist ; read album ; read song ; } <testfile.txt
echo "artist='$artist' album='$album' song='$song'"
# insert your mkdir and mv commands....
在测试文件上运行时,上面输出:
artist='Kanye West' album='College Dropout' song='All Falls Down'
答案 1 :(得分:1)
您可以将文件读入bash数组并循环遍历数组:
IFS=$'\r\n' content=($(cat ${filepath}))
for ((idx = 0; idx < ${#content[@]}; idx+=3)); do
artist=${content[idx]}
album=${content[idx+1]}
title=${content[idx+2]}
done
答案 2 :(得分:1)
或者循环读取三行。
yourscript |
while read artist; do # read first line of input
read album # read second line of input
read song # read third line of input
: self-destruct if the genre is rap
done
此循环将消耗三个一组的输入行。如果没有三行输入的偶数,那么循环内的读取将会失败并且变量将为空。
答案 3 :(得分:1)
您可以将awk
的输出读入数组。 E.g。
readarray -t array <<< "$(printf '%s\n' 'Kanye West' 'College Dropout' 'All Falls Down')"
for ((i=0; i<${#array[@]}; i++ )) ; do
echo "array[$i]=${array[$i]}"
done
产地:
array[0]=Kanye West
array[1]=College Dropout
array[2]=All Falls Down