Arrays 如何在shell脚本中编写忽略空格字符的数组?
我有一个文本文件,其中包含say..以下信息sayArrays 如何在shell脚本中编写忽略空格字符的数组?,arrays,bash,shell,Arrays,Bash,Shell,我有一个文本文件,其中包含say..以下信息saytest.text: an apple of one's eye 我想通过执行cat test.text,使用shell脚本在数组中读取这些行。我尝试过使用a=(`cat test.text`),但这不起作用,因为它将空格视为分隔符。我需要的值是a[0]=an,a[1]=apple of,a[2]=one's eye。我不想使用IFS。需要帮助,请提前感谢 比方说: cat file an apple of one's eye 使用此w
test.text
:
an
apple of
one's eye
我想通过执行cat test.text,使用shell脚本在数组中读取这些行。我尝试过使用a=(`cat test.text`)
,但这不起作用,因为它将空格视为分隔符。我需要的值是a[0]=an
,a[1]=apple of
,a[2]=one's eye
。我不想使用IFS
。需要帮助,请提前感谢 比方说:
cat file
an
apple of
one's eye
使用此while循环:
arr=()
while read -r l; do
[[ -n "$l" ]] && arr+=("$l")
done < file
比如说:
cat file
an
apple of
one's eye
使用此while循环:
arr=()
while read -r l; do
[[ -n "$l" ]] && arr+=("$l")
done < file
您可以使用
read
和。将IFS
设置为换行符,将行分隔符设置为NUL
IFS=$'\n' read -d $'\0' -a a < test.txt
IFS=$'\n'read-d$'\0'-a
您可以使用阅读。将IFS
设置为换行符,将行分隔符设置为NUL
IFS=$'\n' read -d $'\0' -a a < test.txt
IFS=$'\n'read-d$'\0'-a
在bash
4或更高版本中
readarray a < test.text
readarray a
这将为每个空行包含一个空元素,因此您可能希望首先从输入文件中删除空行
在早期版本中,您需要手动构建阵列
a=()
while read; do a+=("$REPLY"); done < test.text
a=()
边读边读;做一个+=(“$REPLY”);完成
在bash
4或更高版本中
readarray a < test.text
readarray a
这将为每个空行包含一个空元素,因此您可能希望首先从输入文件中删除空行
在早期版本中,您需要手动构建阵列
a=()
while read; do a+=("$REPLY"); done < test.text
a=()
边读边读;做一个+=(“$REPLY”);完成
Plainsh
IFS='
'
set -- $(< test.txt)
unset IFS
echo "$1"
echo "$2"
echo "$@"
我倾向于说这些是最好的解决方案,因为它们不涉及循环。Plainsh
IFS='
'
set -- $(< test.txt)
unset IFS
echo "$1"
echo "$2"
echo "$@"
我倾向于说这些是最好的可用解决方案,因为它们不涉及循环。$'\0'
实际上相当于'
(变量在内部是C字符串)@JoSo,很好。我倾向于使用$'\0'
来与$'\n'
保持一致。你是对的,这至少在视觉上更加一致。缺点是它隐藏了shell不能在变量中存储NUL的事实。bash中的read-num分隔特性甚至可能不是故意的,而是源于这样一个事实:算法是“delim的第一个字符用于终止输入行,而不是换行符”。如果参数是空字符串,则不会进一步指定。该实现只是取消对变量对应的C字符串的引用,在空字符串的情况下生成NUL终止符。(请参阅)$'\0'
实际上相当于'
(变量在内部是C字符串)@JoSo,很好。我倾向于使用$'\0'
来与$'\n'
保持一致。你是对的,这至少在视觉上更加一致。缺点是它隐藏了shell不能在变量中存储NUL的事实。bash中的read-num分隔特性甚至可能不是故意的,而是源于这样一个事实:算法是“delim的第一个字符用于终止输入行,而不是换行符”。如果参数是空字符串,则不会进一步指定。该实现只是解除对变量对应的C字符串的引用,在出现空字符串时生成NUL终止符。(请参阅)