Как инициализировать массив элементами с пробелами из вывода команды

Слово, начинающееся с тире, обычно рассматривается как вариант. Когда вы делаете ls *, команда lsполучает ls 001.png -002.png...и видит -002.pngкак набор опций, которые она не понимает. То же самое для многих команд, таких как cp, mv,...

Решение #1 :добавьте к файлам префикс пути. Будет работать во всех случаях.

ls./*

Решение #2 :многие команды, особенно в мире GNU, принимают в качестве параметра двойное -тире, указывающее, что следующее не является параметром

ls -- *

Тем не менее, начальные дефисы не влияют на цикл for.


Что касается «значения, слишком большого для базы», ​​это связано с тем, что -008считается восьмеричным числом, поскольку оно начинается с 0. Однако 8 не является допустимой восьмеричной цифрой.Быстрым решением было бы использоватьbc:

printf -v basename_new %04d "$(bc <<< "${basename} + 10")"

Проблема с ifвызвана пустым basename_newи исчезнет с приведенным выше исправлением.

0
18.12.2019, 20:12
2 ответа

Вы можете использовать mapfile -tи прочитать свои данные из замены процесса, как указал @Kusalananda .

mapfile -t dyn_hosts_start_array < <(grep 'STARTING HOST' sample.log | cut -d' ' -f 1,2)    
for i in "${!dyn_hosts_start_array[@]}"; do
  printf '%s:  start: %s\n' "$i" "${dyn_hosts_start_array[i]}"
done

Или вы можете изменить переменную IFS, которая используется для разделения слов, на символ новой строки (значение по умолчанию — пробел, табуляция и новая строка ), а затем изменить ее обратно на исходное значение.

oldifs=$IFS
IFS=$'\n'
dyn_hosts_start_array=( $(grep 'STARTING HOST' sample.log | cut -d' ' -f 1,2) )
IFS=$oldifs    
for i in "${!dyn_hosts_start_array[@]}"; do
  printf '%s:  start: %s\n' "$i" "${dyn_hosts_start_array[i]}"
done

Выход (оба варианта):

0:  start: 2019-11-11 19:05:55,823
1:  start: 2019-11-11 19:05:55,831
2:  start: 2019-11-11 19:05:55,837
3:  start: 2019-11-11 19:05:55,858
4:  start: 2019-11-11 19:05:55,859
5:  start: 2019-11-11 19:05:55,861
6:  start: 2019-11-11 19:05:55,879
7:  start: 2019-11-11 19:05:55,913
8:  start: 2019-11-11 19:05:56,067

Связанные:

1
28.01.2020, 02:29
awk '{print NR-1 ": ", "start:", $1, $2;}' sample.log

с ответом на вопрос печатает

0:  start: 2019-11-11 19:05:55,823
1:  start: 2019-11-11 19:05:55,831
2:  start: 2019-11-11 19:05:55,837
3:  start: 2019-11-11 19:05:55,858
4:  start: 2019-11-11 19:05:55,859
5:  start: 2019-11-11 19:05:55,861
6:  start: 2019-11-11 19:05:55,879
7:  start: 2019-11-11 19:05:55,913
8:  start: 2019-11-11 19:05:56,067

Чтобы лучше контролировать форматирование вывода, вы также можете использовать printfвот так

awk '{printf "%d:  start: %s %s\n", NR-1, $1, $2;}' sample.log

Подстановка команд имеет некоторые подводные камни с пробелами или специальными символами. Судя по всему, два поля из ввода сохраняются в отдельных элементах массива. Этот сценарий объединяет их на основе вашего исходного сценария.

DYN_HOSTS_START_ARRAY=($(grep -E "STARTING HOST" sample.log | cut -d' ' -f 1,2))
for ((i=0; i< ((${#DYN_HOSTS_START_ARRAY[@]} / 2)); i++))
do
    echo "$i:  start: ${DYN_HOSTS_START_ARRAY[((2 * $i))]} ${DYN_HOSTS_START_ARRAY[((2 * $i + 1))]}"
done
1
28.01.2020, 02:29

Теги

Похожие вопросы