1

我需要从包含多个子字符串的字符串中提取数据。

例子:

@string1 = "string 1"
@string2 = "string 2"
@string3 = "string 3" @string1 @string2

我需要扩展string3。结果将是:

“字符串 3 字符串 2 字符串 1”

如何使用 Bash 扩展列表?


实际上,我需要读取现有 gitolite 配置文件的一部分,以便格式正确。该字符串始终以“@”开头。一个字符串可以包含一个子字符串。

这是格式的样子:

@string1 = hello
@string2 = everyone 
@resultstring = @string1 @string2 this is a string

现在我想扩展@resultstring。结果将是:“大家好,这是一个字符串”

4

2 回答 2

2

你想要的是

string1='string 1'
string2='string 2'
string3="string 3 $string1 $string2"

单引号用于强引用,不扩展变量,而另一方面,您可以在双引号内扩展变量。

另请参阅http://mywiki.wooledge.org/Quotes

于 2012-05-09T15:10:08.913 回答
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.0isms 没问题,您可以直接将该字符串读入关联数组

#!/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
于 2014-01-04T16:51:00.493 回答