我有一个变量:
var='/path/to/filename.ext
/path/to/filename2.ext
/path/to/filename3.ext'
declare -a arr
基于StackOverflow上的大量文章,我找到了几种方法:
# method 1: while loop
while read line; do
arr+=($line)
done <<< "$var"
# method 2: readarray
readarray -t arr <<< "$var"
# method 3:
IFS=$'\n'
arr=("$var")
然而,在我学会所有这些方法之前,我正在使用另一种方法,即:
# method 4 (not working in the current situation)
IFS=$'\n'
read -a arr <<< "$var"
这是行不通的,因为它将只在arr[0]
中存储var
的第一个字符串。我不明白为什么它在分隔符是换行符的情况下不起作用,而它在其他分隔符下却起作用,例如:
IFS='|'
strings='/path/to/filename.ext|/path/to/filename2.ext|'
read -a arr <<< "$strings"
删除了我自己提出的不能为此使用read
的答案。原来你可以。
原来你的答案是错的。是的,你可以!您需要使用-d
切换到read
:
-d
delim
delim的第一个字符用于终止输入行,而不是换行。
如果与空参数一起使用,bash将使用null字节作为分隔符:
$ var=$'/path/to/filename.ext\n/path/to/filename2.ext\n/path/to/filename3.ext'
$ IFS=$'\n' read -r -d '' -a arr < <(printf '%s\0' "$var")
$ declare -p arr
declare -a arr='([0]="/path/to/filename.ext" [1]="/path/to/filename2.ext" [2]="/path/to/filename3.ext")'
成功。在这里,我们使用printf
的进程替换,它只是转储带有一个空html" target="_blank">字节的变量的内容,这样read
就会很高兴并返回一个成功的返回代码。您可以使用:
IFS=$'\n' read -r -d '' -a arr <<< "$var"
在这种情况下,arr
的内容是相同的;唯一的区别是read
的返回代码是1
(失败)。
顺便说一句:
$ IFS=$'\n'
$ read ...
而且
$ IFS=$'\n' read ...
前者全局设置ifs
(即,ifs
将为脚本的剩余部分保留该值--当然,直到您再次修改它为止):您很可能不想这样做!
后者仅为命令read
设置ifs
。你肯定想用那种方式!
另一个侧记:关于你的方法1。您缺少引号,没有取消设置ifs
,也没有使用-r
标志来read
。这很糟糕:
while read line; do
arr+=($line)
done <<< "$var"
while IFS= read -r line; do
arr+=( "$line" )
done <<< "$var"
为什么?
ifs
的情况下,将删除前导空格和尾随空格。-r
时,某些反斜杠将被理解为转义反斜杠(\'
、尾随\
、\
以及其他)。(“$line”)
,您将打开单词拆分和文件名扩展:如果输入包含空格或glob字符(如*
、[
、?
等),您不希望这样做。问题内容: 我正在编写一个程序,以String数组(来自用户输入)的形式将观察结果集写入文件。我能够将观察值写入.txt文件,然后添加新观察值而不删除先前的数据,但是我所有的数据都在同一行上。 我需要将每组观察结果放在单独的行上。 另外,我将需要稍后能够访问该文件并从中读取文件。 我的代码当前如下所示:(观察到的是字符串数组) 我的输出当前看起来像这样: 我希望它看起来像这样: …等等 我该怎么做
问题内容: 我的数据库中有一个带换行符的字符串。我想将该字符串转换为数组,并且对于每一行,在数组中跳转一个索引位置。 如果字符串是: 我想要的结果是这样的: 问题答案: 您可以使用功能,使用“ ”作为分隔符: 例如,如果您有这段代码: 您将获得以下输出: 请注意,您必须使用双引号字符串,因此实际上被解释为换行符。 (有关更多详细信息,请参见该手册页。)
问题内容: 我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。 我整理了几乎所有内容,将这些行转换为数组。 我基本上是这样做的(pseudopython代码) 这行得通,但是似乎有点违反直觉和反pythonic,我想知道是否有更好的方法来处理来自文件的输入,以使最后有一个充满浮点数的数组。 问题答案: 快速回答: 如果您经常处理此类数据,csv模块将有所帮助。 如果您感到疯狂,甚至可以使用完
我正在尝试将文件的内容放入数组中。文件内容是正整数和负整数。 这就是我所做的,以确定我应该使数组多大。inFile是我的扫描仪。我能够打印inFile的内容,但它们不会进入数组。我只得到空值。 这就是我试图将文件内容放入数组所做的。 谢谢你的帮助。
问题内容: 我认为能够将文本文件读入和写出字符串数组的能力是相当普遍的要求。从一种语言开始消除最初访问数据库的需求时,它也非常有用。Golang中是否存在? 例如 和 我宁愿使用现有的而不是重复的。 问题答案: 从Go1.1版本开始,有一个bufio.Scanner API可以轻松读取文件中的行。考虑上面的以下示例,该示例使用Scanner重写:
问题内容: 我想将要制作的游戏按钮制作为真正的HTML按钮,但它们必须位于画布内。 我将如何去做呢? 问题答案: 鉴于canvas元素具有透明的内容模型,它可能包含 后备 元素,如果该元素不受支持,则会显示该元素。如果支持画布, 则 不会 显示它们。 __ 您可以相对于画布的父对象放置HTML元素,以使按钮“悬停”在画布上。甲菜单元件可以是适当的语义元素来呈现的控件的列表,这取决于上下文: HTM