如果inner.sh
存在
#...
echo first
echo second
echo third
而 outer.sh
是
var=`./inner.sh`
# only wants to use "first"...
如何将var
按空格拆分?
如果inner.sh
存在
#...
echo first
echo second
echo third
而 outer.sh
是
var=`./inner.sh`
# only wants to use "first"...
如何将var
按空格拆分?
试试这个:
var=($(./inner.sh))
# And then test the array with:
echo ${var[0]}
echo ${var[1]}
echo ${var[2]}
输出:
first
second
third
说明:
var=(first second third)
,例如。$(./inner.sh)
运行 inner.sh
脚本,它在单独的行上打印出first
,second
和third
。由于我们没有在$(...)
周围加双引号,它们被合并到同一行上,但是由空格分隔开,因此最终呈现出与上一个小点标记中看起来相同的结果。var=( $( echo "1 2 3" ; echo "4 5 6" ) ) ; echo ${var[0]}
我期望得到“1 2 3”,但它输出了“1”。这要取决于你的用例,mapfile
执行我所需的操作。 - Stéphane Gourichonvar=( ...
命令前加上IFS=$'\n'
,然后在下一行使用unset IFS
取消bash的内部字段分隔符。 - miu不要忘记内置的mapfile
。在您的情况下,它绝对是最有效的:如果您想将整个文件读入一个数组中,该数组的字段将是./inner.sh
输出的行。
mapfile -t array < <(./inner.sh)
然后你将拥有数组中的第一行,如${array [0]}
,以此类推...
有关此内置程序及所有可能选项的更多信息:
help mapfile
firstline
的变量中,则可以执行以下操作:read -r firstline < <(./inner.sh)
以下是最有效的方法!
这个小基准测试将证明它:
$ time mapfile -t array < <(for i in {0..100000}; do echo "fdjsakfjds$i"; done)
real 0m1.514s
user 0m1.492s
sys 0m0.560s
$ time array=( $(for i in {0..100000}; do echo "fdjsakfjds$i"; done) )
real 0m2.045s
user 0m1.844s
sys 0m0.308s
./inner.sh
输出的第一行的第一个单词,最高效的方法是:read firstword _ < <(./inner.sh)
brew info mapfile || echo "found $(brew desc -s mapfile | wc -l) references to mapfile"
-> 错误:没有mapfile可用的配方。发现0个关于mapfile的引用
让我继续… sh-3.2 $ mapfile
-> sh:mapfile:未找到命令
- Alex Graymapfile
是Bash≥4内置命令,不支持POSIX shell或Bash<4。看起来你正在使用3.2版本的Bash,你需要安装更新的Bash版本,否则将无法使用该命令。 - gniourf_gniourfmapfile -t var < <( echo "1 2 3" ; echo "4 5 6" ) ; echo ${var[1]}
,它正确地输出了“4 5 6”。 - Stéphane Gourichonmapfile
时使用正确的 Bash 版本,因为这在 OS X 上是常见的错误来源。我不知道为什么你的错误信息前缀是 -bash
。很抱歉,我没有可用的 OS X。此外,在这里有很多人在 OS X 上使用 mapfile
,所以我怀疑是你做错了什么。我只是想帮助你,从基础开始建议你再次检查版本号。现在很抱歉我无法提供更多帮助。 - gniourf_gniourf你并不是在空格上进行分割,而是在换行符上进行分割。试试这个:
IFS=$'
'
var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS
var
的元素? - djechlin
for word in $var; do
? - Dmytro Sirenko