1

複数の部分文字列を含む文字列からデータを抽出する必要があります。

例:

@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 を展開します。結果は次のようになります。「こんにちは、これは文字列です」

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 シェルで使用できます。

#!/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 に答える