Если 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
script, который выводит first
, second
и third
на отдельные строки. Поскольку мы не добавляем двойные кавычки вокруг $(...)
, они попадают в одну и ту же строку, но разделяются пробелами, поэтому вы получаете то, что похоже на предыдущую маркерную точку.Не забывайте встроенный mapfile
. Это определенно наиболее эффективно в вашем случае: если вы хотите разрезать весь файл в массиве, полями которого будут строки, выводимые ./inner.sh
, do
mapfile -t array < <(./inner.sh)
Тогда у вас будет первая строка в ${array[0]}
и т.д.
Для получения дополнительной информации об этом встроенном и всех возможных вариантах:
help mapfile
Если вам нужна только первая строка в переменной под названием firstline
, do
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)
Вы не разделяете пробелы, а скорее на линиях новой строки. Дайте этому вихрь:
IFS=$'
'
var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS