如何在bash脚本中创建列表和附加值



我有一个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'

最新更新