Создайте Array of File путей с помощью цикла и grep через них - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу сохранить каждый выходной путь к файлу в переменной, а затем выполнить поиск по ним, чтобы найти метку времени.Я хочу пометить каждую переменную, добавив nodeId из списка узлов, по которому я зацикливаюсь.Когда я пытаюсь сделать это с помощью следующего кода, я получаю сообщение об ошибке

output1_1: команда не найдена

nodeList=('1_1' '1_6' '2_1' '2_6')
for i in "${nodeList[@]}"
do
   output${i}=$CWD/output/abc${i}.txt
   times${i}=$(grep  -m 1 '\"path\":' $output${i}| sed 's/.*timestampUtc\"://g' | sed 's/,.*//g')
done

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Один из способов установить переменную, имя которой получено из другой переменной, - это использовать параметр -v для printf.Чтобы получить значение переменной, имя которой находится в другой переменной (например, varname), используйте ${!varname}.

См. Создание имени строковой переменной из значения другой строки и Как я могу сгенерировать новые имена переменных на лету в сценарии оболочки? .

Использование этих возможных тел цикла:

output_var=output${i}
times_var=times${i}

printf -v "$output_var" '%s' "$CWD/output/abc${i}.txt"
printf -v "$times_var" '%s' "$(grep  -m 1 '\"path\":' "${!output_var}" | sed 's/.*timestampUtc\"://g' | sed 's/,.*//g')"

Обратите внимание, что (если только CWD установлен в другом месте вашей программы) вы, вероятно, хотите $PWD вместо $CWD.

0 голосов
/ 12 сентября 2018

Как подсказал @ muru , попробуйте

declare -A output times
nodeList=('1_1' '1_6' '2_1' '2_6')
for i in "${nodeList[@]}"; do
   output[${i}]=${PWD}/output/abc${i}.txt
   times[${i}]=$(grep  -m 1 '\"path\":' ${output[${i}]} | sed 's/.*timestampUtc\"://g' | sed 's/,.*//g')
done
...