我有一个file.env
与此类似的文件 ( ):
kw_var1='string1'
kw_var2='string 2'
kw_var3='this is string 3'
kw_var4='does not matter'
kw_var5='maybe'
w_var1=qwert_1
w_var2=qwert_2
w_var3=qwert_3
w_var4=qwert_4
我需要创建一个字符串list_of_values
,其中包含以 开头的所有变量的值kw_
,即
$ echo -e $list_of_values
应该输出:
'string1' 'string 2' 'this is string 3' 'does not matter' 'maybe'
我试图迭代它们,但无法使其正常工作。我的代码:
list_of_values=$(for param in $(cat $file.env | grep "kw\_"); do echo $(echo -e '$'$param | cut -s -d '=' -f1); done)
但这就是我得到的:
$kw_var1 $kw_var2 $kw_var3 $kw_var4 $kw_var5
注意:
list_of_values
将用作另一个函数的参数任何有什么问题的想法?
更新:
在做最后的回声时,我使用了:
$ echo -e $list_of_values | tr '\n' ' '
将所有内容放在一行中。
$ cat tst.awk
/^kw_/ {
sub(/[^=]+=/,"")
str = str sep $0
sep = " "
}
END {
print str
}
例如,请注意它this=that
正确处理您想要的输出字符串:
$ cat file
kw_var1='string1'
kw_var2='string 2'
kw_var3='this is string 3'
kw_var4='does not matter'
kw_var5='maybe'
kw_var6='this=that'
w_var1=qwert_1
w_var2=qwert_2
w_var3=qwert_3
w_var4=qwert_4
$ awk -f tst.awk file
'string1' 'string 2' 'this is string 3' 'does not matter' 'maybe' 'this=that'
更新:鉴于您现在在评论中告诉我们的内容,假设您有时需要通过标签访问单个值,我会这样做,否则您可以使用常规数组而不是关联数组:
$ cat tst.sh
#!/bin/env bash
declare -A kw
declare -A w
while IFS= read -r line; do
tag="${line%%=*}"
val="${line#*=}"
case "$tag" in
kw* ) kw["$tag"]="$val" ;;
w* ) w["$tag"]="$val" ;;
?* ) printf 'Error: unexpected contents: "%s"\n' "$line"; exit 1;;
esac
done < file.env
printf '\nAll kw indices => values:\n'
for idx in "${!kw[@]}"; do
printf '\t%s => %s\n' "$idx" "${kw[$idx]}"
done
printf '\nAll kw values passed to a function (printf) at once:\n'
printf '\t%s\n' "${kw[@]}"
printf '\nAll w indices => values:\n'
for idx in "${!w[@]}"; do
printf '\t%s => %s\n' "$idx" "${w[$idx]}"
done
printf '\nAll w values passed to a function (printf) at once:\n'
printf '\t%s\n' "${w[@]}"
.
$ ./tst.sh
All kw indices => values:
kw_var4 => does not matter
kw_var5 => maybe
kw_var6 => this=that
kw_var1 => string1
kw_var2 => string 2
kw_var3 => this is string 3
All kw values passed to a function (printf) at once:
does not matter
maybe
this=that
string1
string 2
this is string 3
All w indices => values:
w_var3 => qwert_3
w_var2 => qwert_2
w_var1 => qwert_1
w_var4 => qwert_4
All w values passed to a function (printf) at once:
qwert_3
qwert_2
qwert_1
qwert_4
上面是在这个 file.env 上运行的,值周围没有多余的单引号,否则你只需在脚本中删除它们:
$ cat file.env
kw_var1=string1
kw_var2=string 2
kw_var3=this is string 3
kw_var4=does not matter
kw_var5=maybe
kw_var6=this=that
w_var1=qwert_1
w_var2=qwert_2
w_var3=qwert_3
w_var4=qwert_4
WRT我们在评论中讨论和使用printf '<%s>\n'
代替fitsort
我不知道,不具备:
$ list[0]='foo bar'; list[1]='etc'
$ printf '<%s>\n' "${list[@]}"
<foo bar>
<etc>
$ printf '<%s>\n' $(printf '%s\n' "${list[@]}")
<foo>
<bar>
<etc>
$ printf '<%s>\n' "$(printf '%s\n' "${list[@]}")"
<foo bar
etc>
看看第一个版本如何正确地简单地将 的内容传递list[]
给 fitsort-replacement 命令,而其他版本则将 printf 输出的字符串传递给它?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句