我需要从包含多个子字符串的字符串中提取数据。
示例:
@string1 = "string 1"
@string2 = "string 2"
@string3 = "string 3" @string1 @string2
我需要扩展string3。结果将是:
“string3 string2 string1”
如何使用Bash扩展列表?
实际上我需要读取现有gitolite配置文件的一部分,以便格式化正确。该字符串始终以“@”开头。字符串可以包含子字符串。
格式如下:
@string1 = hello
@string2 = everyone
@resultstring = @string1 @string2 this is a string
现在我想扩展@resultstring。结果将是:“大家好,这是一个字符串”
答案 0 :(得分:2)
你想要的是
string1='string 1'
string2='string 2'
string3="string 3 $string1 $string2"
单引号用于强引号,不扩展变量,而另一方面,您可以在双引号内扩展变量。
答案 1 :(得分:0)
如果“=”在其他地方被硬编码,你可以将这个awk助手用于任何posix shell:
#!/bin/sh
print_var(){
awk 'BEGIN{FS=" = "}
{ if ($1=="'$1'"){
len=split($2,words," ")
for(i=0;i<=len;i++){
if (match(words[i],"@")) printf strings[words[i]]
else printf words[i]
printf (i==len)?"\n":" "
}
} else strings[$1]=$2
}' $2
}
print_var @resultstring input
或者如果bash-4.0ism没问题,你可以直接将这些字符串读到关联数组
#!/bin/bash
print_var(){
declare -A STRINGS
while read FIRST EQUAL STRING || [ "$FIRST" ]; do
case $FIRST in
@*)STRINGS["${FIRST#@}"]="$STRING";;
esac
done < "$2"
for x in ${STRINGS[${1#@}]}; do
case $x in
@*)printf "%s " ${STRINGS[${x#@}]};;
*)printf "%s " "$x";;
esac
done
echo
}
print_var @resultstring input