我想将每个输出文件路径保存到一个变量,然后通过它们进行grep查找时间戳。我想通过循环遍历的节点列表中的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
答案 0 :(得分:0)
按照@ 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
答案 1 :(得分:0)
设置变量名称是从另一个变量派生的一种方法是使用-v
选项设置'printf'。
要获取名称在另一个变量(例如varname
)中的变量的值,请使用${!varname}
。
请参见Creating a string variable name from the value of another string和How can I generate new variable names on the fly in a shell script?。
使用这些可能的循环体是:
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
。