Слово, начинающееся с тире, обычно рассматривается как вариант. Когда вы делаете 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
и исчезнет с приведенным выше исправлением.
Вы можете использовать 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
Связанные:
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