将换行符分隔列表保存为多个bash变量

时间:2013-12-03 04:55:58

标签: bash shell awk

我是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")"

4 个答案:

答案 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