使用多个子字符串扩展字符串

时间:2012-05-09 15:00:46

标签: string bash

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

示例:

@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。结果将是:“大家好,这是一个字符串”

2 个答案:

答案 0 :(得分:2)

你想要的是

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

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

另见http://mywiki.wooledge.org/Quotes

答案 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
相关问题