【问题标题】:How to split break lines with Bash scripts?如何使用 Bash 脚本分割换行符?
【发布时间】:2019-05-11 23:48:24
【问题描述】:

如果你有一个带分隔符的字符串,比如说, 字符,你可以像这样使用IFS

text=some,comma,separated,text
IFS="," read -ra ADDR <<< "$text"

for i in ${ADDR[@]}
do
    echo $i
done

每个单词都将打印在一个新行中。但是,如果您获取像 ls 这样的命令的结果,然后尝试在 \n 上拆分它,您将不会得到相同的结果:

results=$(ls -la)
IFS="\n" read -ra ADDR <<< "$results"

for i in ${ADDR[@]}
do
    echo $i
done

它只打印 2 行,它们甚至不是文件条目。这是

total
36

ls 命令输出的第一行。

有人可以提供一点帮助吗? 如果不是正确的方法,那是怎么回事?

【问题讨论】:

标签: linux bash sh ifs


【解决方案1】:

read 通常会一直读取到换行符为止,除非你用-d 告诉它。

在本例中,我们使用-d $'\0'。这将读取 shell,直到它到达一个空字符(它不会出现在 ls 的输出中)。然后IFS=$'\n' 导致shell 在换行符处拆分并将每一行分配为一个数组元素。注意使用$'...' 而不是"..." 来解释转义序列。

results=$(ls -la)

IFS=$'\n' read -ra ADDR -d $'\0' <<< "$results"

for i in "${ADDR[@]}"
do
    echo "$i"
done

最后但同样重要的是,我们必须同时引用数组的替换和$i

【讨论】:

  • ls -la | while read line; do echo "$line"; done 也不会这样做吗?
  • @U.Windl 可能,但 OP 询问他的代码有什么问题。
【解决方案2】:

使用readarraymapfile 将多行读入一个数组。简单得多。确保在循环中也引用变量扩展。

results=$(ls -la)
readarray -t ADDR <<< "$results"

for i in "${ADDR[@]}"
do
    echo "$i"
done

或者跳过$results变量:

readarray -t ADDR < <(ls -la)

【讨论】:

    【解决方案3】:

    我不确定您在寻找什么样的输出,但猜想您正在寻找分成标记的每一行。这是一种方法:

    /bin/ls -la | while read -ra line
    do
        # Whole line
        echo "Line: >${line[@]}<"
    
        # Break each line into tokens
        for i in ${line[@]}
        do
            echo "- $i"
        done
    done
    

    注意事项

    • 第一行获取ls -la 的输出并输入while 循环,将每一行作为数组读取
    • 在 while 循环中,我们可以将行作为一个整体处理,也可以作为单个标记处理

    输出摘录

    Line: >-rw-r--r-- 1 haiv staff 142 May 8 10:56 star.md<
    - -rw-r--r--
    - 1
    - haiv
    - staff
    - 142
    - May
    - 8
    - 10:56
    - star.md
    Line: >drwxr-xr-x 7 haiv staff 224 May 2 10:26 tailstring<
    - drwxr-xr-x
    - 7
    - haiv
    - staff
    - 224
    - May
    - 2
    - 10:26
    - tailstring
    

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2016-09-16
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2015-01-27
      相关资源
      最近更新 更多