如果您有一个带有定界符的字符串,比方说一个,
字符,则可以像这样使用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
命令输出的第一行。
有人可以帮忙吗? 如果这不是正确的方法,那怎么办?
答案 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'] = true
或readarray
将多行读入数组。简单得多。确保在循环中也引用变量展开。
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循环,将每一行读取为一个数组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