如何使用Bash脚本分割换行符?

时间:2019-05-11 23:48:24

标签: linux bash sh ifs

如果您有一个带有定界符的字符串,比方说一个,字符,则可以像这样使用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

它只打印两行,甚至都不是文件条目。是

total
36

ls命令输出的第一行。

有人可以帮忙吗? 如果这不是正确的方法,那怎么办?

3 个答案:

答案 0 :(得分:1)

read通常读取直到到达换行符,除非您另外使用-d告诉它。

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

results=$(ls -la)

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

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

最后但并非最不重要的一点,我们必须引用数组和$i的替换。

答案 1 :(得分:1)

使用$config['encrypt_name'] = truereadarray将多行读入数组。简单得多。确保在循环中也引用变量展开。

mapfile

或跳过results=$(ls -la) readarray -t ADDR <<< "$results" for i in "${ADDR[@]}" do echo "$i" done 变量:

$results

答案 2 :(得分:0)

我不确定您要寻找哪种输出,但是猜测您正在寻找分解成令牌的每一行。这是一种方法:

/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