変数拡張は、生の文字列値に中括弧を追加します。

変数拡張は、生の文字列値に中括弧を追加します。

注:この問題を引き起こしたスクリプトの構文の問題を見逃しました。 ${bar}を{$bar}に渡しています。この種の問題については、削除またはロックすることができます。


私が書いているスクリプトをテストしようとしています。変数の内容を表示するために、変数が渡された関数でエコーを試みました。この場合、拡張変数の周りに中かっこが追加されます。これが行われる理由とそれを防ぐ方法についてのアイデアはありますか?コマンドに変数を渡すと、中かっこが含まれ、エラーが発生する可能性があると仮定します。この仮定が間違っている場合は訂正してください。コードは次のとおりです。

editncopy()
{
  for i in {1..5}; do echo ${!i}; done
}

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}

editncopy string1 string2 ${foo} ${bar} ${s}

出力は次のとおりです。

[me@home dir]$ ./myscript.sh
string1
string2
/some/path/to/file.sh
{username@server:/another/dir/}
myserver
[me@home dir]$

常に関数の$ 4変数に角括弧を追加してください({username@server:/another/dir/}は単にusername@server:/another/dir/である必要があります)。自分でエコを試してみましたが(エコ$4)問題ありません。

簡単に言えば、このスクリプトはsedを使用して他のスクリプトの内容を変更し、scpを使用して別のサーバーにコピーします。

ベストアンサー1

関数に渡された引数を繰り返します(これはスクリプトの引数を繰り返すのにも機能します)。

#!/bin/sh

foo () {
    for i in "$@"; do
        printf 'Argument is "%s"\n' "$i"
    done
}

foo a b "c d" e "f g h"

出力:

Argument is "a"
Argument is "b"
Argument is "c d"
Argument is "e"
Argument is "f g h"

またはあなたの価値に応じて:

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}
foo string1 string2 ${foo} ${bar} ${s}

これは生産します

Argument is "string1"
Argument is "string2"
Argument is "/some/path/to/file.sh"
Argument is "username@myserver:/another/dir/"
Argument is "myserver"

コードに誤字がある可能性があります$。合計が次のように変わりました。{${bar}

$ foo {$bar}
Argument is "{username@myserver:/another/dir/}"

おすすめ記事