7

私はbashでスクリプトを実行しています。条件に応じて、変数にさまざまなものを追加し、最後に表示したい場合は、次のようになります。

VAR="The "

if [[ whatever ]]; then
    VAR="$VAR cat wears a mask"
elif [[ whatevs ]]; then
    VAR="$VAR rat has a flask"
fi

しかし、ときどき改行を追加したい場合に、この形式の VAR を追加して VAR を構築しようとすると、問題が発生します。VAR="$VAR\nin a box"たとえば、どうすればよいですか?以前の使用法を見たことがありますが、追加のため$'\n'に使用しようとした場合もありません。$VAR

4

3 に答える 3

10

ANSI-C 引用符の使用:

var="$var"$'\n'"in a box"

$'\n'を変数に入れることができます:

newline=$'\n'
var="$var${newline}in a box"

ところで、この場合、連結演算子を使用することをお勧めします。

var+="${newline}in a box"

ANSI-C の引用が気に入らない場合はprintf、その-vオプションを使用できます。

printf -v var '%s\n%s' "$var" "in a box"

次に、変数の内容を出力するために、var引用符を忘れないでください!

echo "$var"

または、さらに良いことに、

printf '%s\n' "$var"

述べる。Bash では大文字の変数名を使用しないでください。これはひどいことです。ある日、既存の変数と衝突するでしょう!


次のように、間接展開を使用して変数に改行と文字列を追加する関数を作成することもできます (マニュアルのシェル パラメータ展開セクションを参照してください)。

append_with_newline() { printf -v "$1" '%s\n%s' "${!1}" "$2"; }

それで:

$ var="The "
$ var+="cat wears a mask"
$ append_with_newline var "in a box"
$ printf '%s\n' "$var"
The cat wears a mask
in a box
$ # there's no cheating, look at the content of var:
$ declare -p var
declare -- var="The cat wears a mask
in a box"

楽しみのために、 n+1 個の引数 ( n≥1 ) をappend_with_newline取り、改行を使用してそれらすべてを連結する関数の一般化されたバージョンを次に示します (最初の引数は展開される変数の名前であることを除いて)。区切り記号を付け、変数に答えを入れます。変数の名前は最初の引数で指定されます。

concatenate_with_newlines() { local IFS=$'\n'; printf -v "$1" '%s\n%s' "${!1}" "${*:2}"; }

それがどれほどうまく機能するか見てください:

$ var="hello"
$ concatenate_with_newlines var "a gorilla" "a banana" "and foobar"
$ printf '%s\n' "$var"
hello
a gorilla
a banana
and foobar
$ # :)

IFSとを使った面白いトリック"$*"です。

于 2013-11-11T17:57:12.247 に答える
3

デフォルトでは、bashエスケープ文字は処理されません。割り当て

VAR="foo\nbar"

変数に 8 文字を割り当てますVAR: 'f'、'o'、'o'、'\'、'n'、'b'、'a'、および 'r'。POSIX 標準では、コマンドは引数内echoの 2 文字の文字列を改行として扱う必要があると規定されています。この場合、標準に準拠しておらず、この処理を有効にするオプションが必要です。このコマンドは POSIX 仕様に従い、引数のリテラル "\n" を改行として扱いますが、プレースホルダーを置き換える文字列でそのような使用を展開しません。\nbash-eprintfprintf "%s\n" "$VAR"

foo\nbar

それ以外の

foo
bar

文字列に実際の改行文字を含めるには、ANSI 引用符を使用できます。

VAR=$'foo\nbar'

これには、文字列が単一引用符で囲まれた文字列として処理され、パラメーター展開やコマンド置換を含めることができないという欠点があります。もう 1 つのオプションは、複数の行にまたがる文字列に、引用符で囲まれた改行文字を含めることです。

$ VAR="foo
> bar"
$ echo "$foo"
foo
bar
于 2013-11-11T18:12:23.170 に答える