1

このコマンドを使用してマシン上でスクリプトを実行しました

printf -v $1 %s $2

私が使用しているサーバーでは問題なく動作しています。しかし、スクリプトを別のサーバーにコピーすると、このエラーが発生します。ここで何が欠けていますか?

編集:コードがスクリプトに対して行うことは、変数を宣言することですが、関数でローカライズされていません。これが完全な機能です

#Declare each property=value as regular bash variable=value
function getProperty {
    for x in $(echo ${1} | tr ":" "\n")
    do
        set -- $(echo ${x} | tr "=" "\n")
        printf -v $1 %s $2
        #I tried using declare, but the variables become localized to this function only
    done
}
4

2 に答える 2

2

exportうまくいきますか?

export "${1}=$(printf %s "$2")"

ここで間違ったツリーを吠えているかもしれません...

于 2012-08-15T09:45:38.090 に答える
1

次の形式で入力を取得しようとしているようです。

var=value:var=value

入力の一部に空白、改行、またはグロブ文字が含まれている場合、これは失敗します。参照: for で行を読まないでください。最初のパラメーターが空の場合も失敗します。展開が引用符で囲まれていないため、グロビングと単語分割の複数のパスを処理しているため、おそらく問題が発生します。

残念ながら、間接代入は Bash の最大の失敗の 1 つです。これを頻繁に行う場合は、スクリプト全体を nameref 変数を使用できる ksh に切り替えることを真剣に検討する必要があります。この機能のためだけでも非常に価値があります。(Bash の次のバージョンではこれが解決されるはずです)。

コレクションを扱うには、配列を使用する必要があります。このようなキーと値のペアを処理する必要がある場合は、Bash 4 と連想配列を使用する必要があります。printf -v最近の十分なBashで外部スコープへの間接割り当てを行う最良の方法です。Bash 4.2 を使用している場合はdeclare -g、グローバルに割り当てるために使用できます。bash が古すぎてこれを実行できない場合は、アップグレードしてください。

いくつかのテクニックと連想配列の使用方法については、http: //mywiki.wooledge.org/BashFAQ/006で説明しています。

引用する方法についても読んでください。

于 2012-08-15T11:04:26.710 に答える