【问题标题】:bash: nested substitution only assigns last value to variablebash:嵌套替换仅将最后一个值分配给变量
【发布时间】:2011-05-18 10:19:33
【问题描述】:
for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3"

从我们使用的基于 .txt 的播放列表中生成一个排序的、唯一的列表。

a=$(for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")

虽然只包含该列表的最后一个值。

知道为什么以及我可以做些什么来在我的变量中包含 整个列表?我迷路了……

最后我需要上面的两个变体来比较/比较输出,看看两个目录中包含的文件有什么不同。

【问题讨论】:

    标签: bash command substitution


    【解决方案1】:

    您通过重载运算符使这变得不必要地复杂。您可以将其取消嵌套大约三个级别,并且仍然保留功能。

    a=$(find Balzac/ -iname "20??????.txt" -exec cat {} + | cut -c 10-21 | sort | uniq | egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")
    

    事实上,我猜你接下来要做的就是遍历这些文件。如果是这样,您可以跳过变量赋值并像这样使一些可读的东西:

    find Balzac/ -iname "20??????.txt" -exec cat {} + |
        cut -c 10-21 |
        sort | uniq |
        egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3" |
        while read file; do
            #Do something with $file
        done
    

    【讨论】:

    • 做得非常好!一个答案不仅可以帮助我,还可以改善我的 bash !!谢谢!
    • Weeellll,实际上你的短版本只输出最后一个条目,和我的例子一样。如果我在while-loop 中echo,那么长版本会很好地输出所有内容,但我不能将所有内容分配给一个变量,因为该变量不会“存活”while 循环......最后我需要以上两种变体以compare/diff输出相互对抗。
    • 您确定 cut、sort、uniq 和 egrep 的组合实际上首先返回了多个项目吗?当您在变量赋值之外手动运行该行时会发生什么?
    • 然后我得到一个完整的列表,应该是这样。这就是让我深感困惑的地方。分配工作之外的命令,但仅分配一项在列表中。
    • 我的测试表现完全不同。你用的是什么版本的shell?
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多