我有一个while循环,需要将循环的结果附加到bash脚本中的列表中(就像在python中一样(。如何做到这一点。我创建了一个数组,但里面没有逗号。它只有空格,但我想要逗号,这样我就可以在.env文件中使用它们
arr=()
while [ ]
do
........
........
........
val='some value'
arr+=$val
done
echo ${arr}
输出:
('some value1' 'some value2' 'some value3')
预期结果:
['some value1','some value2','some value3']
这里有一个想法/方法。
#!/usr/bin/env bash
arr=()
while IFS= read -r val; do
arr+=("'$val'")
done < <(printf '%sn' 'foo bar' 'baz more' 'qux lux')
(IFS=,; printf '[%s]' "${arr[*]}")
输出
['foo bar','baz more','qux lux']
以下是使用echo
:的解决方案
arr=()
while [ ... ]
do
........
........
........
val='some value'
arr+=("$val") # () and "" added
done
# print each value protected by "" and separated by ,
first=true
echo -n "arr values = [ "
for v in "${arr[@]}" ; do
if $first ; then first=false ; else echo -n ", " ; fi
echo -n ""$v""
done
echo " ]"
# Another way to print arr values
declare -p arr
要在python文件中写入数组值,您可以尝试以下操作:
dest="somefile.py"
{
first=true
echo -n "arr = [ "
for v in "${arr[@]}" ; do
if $first ; then first=false ; else echo -n ", " ; fi
echo -n ""$v""
done
echo " ]"
} >| "$dest"
请注意,它是脆弱的,如果v
包含"
,它将不起作用。本文给出了算子@Q
(man bash
中的"搜索参数变换"(:
dest="somefile.py"
{
first=true
echo -n "arr = [ "
for v in "${arr[@]}" ; do
if $first ; then first=false ; else echo -n ", " ; fi
echo -n "${v@Q}" # operator @Q
done
echo " ]"
} >| "$dest"
从预期输出开始,这里有很多问题。命令echo ${arr}
遭受中断引用,并且无论如何只打印数组的第一个元素;您期望的输出看起来像Python表示列表的方式,但Bash只需以您指定的任何格式打印值本身,而不需要任何您自己没有设置的明确格式。
要打印数组,请尝试
printf '%sn' "${arr[@]}"
要打印每个值周围带有明确格式的数组,请尝试例如
printf "['%s'" "${arr[0]}"
printf ",'%s'" "${arr[@]:1}"
printf ']n'
现在,要首先正确地构建数组,必须添加到数组中,而不是添加到第一个元素中。
arr=()
while true; # not while [ ]
do
........
arr+=('some value') # use parentheses
done
要在输出之前添加VARIABLE_VALUE=
,只需。。。这样做。
printf "VARIABLE_VALUE=['%s'" "${arr[0]}"
printf ",'%s'" "${arr[@]:1}"
printf ']n'