вывод команды в массив в оболочке sh - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь получить вывод команды в массив, и для этого попробовал следующее:

#!/bin/sh

cmd=($(date +%s;sleep 5; date +%s))
start_time=$cmd[0]
end_time=$cmd[1]
echo $start_time

#EOF

Я ожидал echo $ start_time, чтобы дать мне время начала, но выводит следующее:

1572443382 1572443386 [0]

Невозможно переключиться на оболочку bash и иметь доступ только к sh

Ответы [ 3 ]

5 голосов
/ 30 октября 2019

Обычный sh не имеет массивов. Вы должны справиться без массивов. В вашем случае это просто:

start=$(date +%s)
sleep 5
end=$(date +%s)

echo "start=$start end=$end"

Если вы действительно, действительно хотите, чтобы все было в одной подоболочке, вам нужно сохранить выходные данные в виде простой строки и проанализировать эту строку, чтобы получить отдельные значения. Вы можете думать об этой одной строке как о «массиве», где каждая строка является записью массива. Отдельные строки можно получить с помощью sed (в котором используются индексы, начинающиеся с 1, а не 0).

times=$(date +%s; sleep 5; date +%s)

echo "start=$(echo "$times" | sed -n 1p) end=$(echo "$times" | sed -n 2p)"

Для хранения отдельных строк в переменных используйте подоболочки:

times=$(date +%s; sleep 5; date +%s)
start=$(echo "$times" | sed -n 1p)
end=$(echo "$times" | sed -n 2p)

echo "start=$start end=$end"

Однакоесли вы просто хотите вычислить, сколько времени занял sleep 5, вы можете также использовать time sleep 5, который уже делает это для вас.

2 голосов
/ 30 октября 2019

Позиционные параметры - самое близкое, что sh имеет к массиву:

sh-3.2$ set -- "$(date +%s)"; sleep 5; set -- "$@" "$(date +%s)"
sh-3.2$ start=$1 end=$2; echo "$start -> $end"
1572448562 -> 1572448567
0 голосов
/ 30 октября 2019

Вам необходимо использовать синтаксис $ {array [index]} для доступа к элементам массива. Итак, измените ваши start_time и end_time следующим образом.

start_time=${cmd[0]}
end_time=${cmd[1]}

Также измените

#!/bin/sh на #!/bin/bash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...