追加のカンマ付きの bash 宣言

追加のカンマ付きの bash 宣言

Bashの「ドア」とは何ですか?

declare -r is_debug true
if [ "$is_debug" = true ]; then
    printf "%s\n", "is debug"
else
    printf "%s\n", "is not debug"
fi

declare -p is_debug
echo "${is_debug-isunset}"

出力:

jian@jian:~/Desktop/pg_src/src4/postgres$ bash /home/jian/scratch/scratchpads/47a6066b9dfaca1c2b13ea2e99f4e929/scratch.sh
is not debug
,declare -r is_debug
isunset
jian@jian:~/Desktop/pg_src/src4/postgres$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


declare -p is_debug
echo "${is_debug-isunset}"

出力が混乱しています,declare -r is_debug。戻ってきてくださいdeclare -r is_debug

答え1

declare -r is_debug true

2 つの読み取り専用変数を宣言し、is_debugそのtrue値を設定しないでください。関数内で呼び出されない限り、元の値(存在する場合)を維持します。関数内で呼び出されると、値のない新しいローカル変数がインスタンス化されます(変数がそのlocalスコープで//事前宣言されていない場合)。typesetdeclare

次のことができます。

declare -r is_debug=true

または、より移植性に優れています(関数内で呼び出された場合は変数をローカルに作成しません)。

readonly is_debug=true
printf "%s\n", "is debug"

それは次のとおりです。

printf '%s\n,' "is debug"

または

printf 'is debug\n,'

印刷is debugの後に改行文字が続き、その後にカンマが続きます。後には改行文字がないので、出力の次の内容が対応するコンマに追加されます。

次のことができます。

printf '%s\n' 'is debug'

または:

printf 'is debug\n'

または:

echo 'is debug'

(改行自体を追加します)

または:

echo is debug

echoパラメータを印刷する前にスペースで連結する場合も同様です。

しかし、printf通常よりecho、この場合の使用に問題はありません。echoこれは、最初のパラメータがで始まらず、-すべてのパラメータにバックスラッシュがなく、純粋なASCII文字が含まれているためです。

カンマは、cshスタイルの中かっこ拡張で項目を区切るために使用されます。

$ echo {a,b}c
ab ac

ここでは、zshの代わりに次のように書くことができます。

$ {echo,is,debug}
is debug

とKornスタイルの算術式(Cに似た構文)

$ echo "$(( (a = 6), (b = 7), a * b ))"
42

(すべてのシェルが,算術式をサポートしているわけではありません。ksh93では、ドットが,代わりにカンマであるロケールの浮動小数点基数文字と競合する可能性があります。)

ただし、コマンドパラメータを区別するためには使用されません。コマンドの引数はスペースで区切られています(Bashの場合、これらの文字はロケール内のスペースとして分類され、スペース、タブ、および時には改行されないスペース文字を含む単一バイトにエンコードされます)。

おそらくprintfCと同様の機能のために混乱する可能性があります。awkでは、awk以下を書くことができます。

BEGIN{printf "%s %d\n", "string", number}

Cと同様に、次のように書くことができます。

printf("%s %d\n", "string", number);

(かっこを使用することもできますawk。)

ただし、シェル言語の構文は、他のほとんどの言語(特にC / awk)の構文とは大きく異なります。

シェルでは、引用符は文字列定数(シェルのすべての内容は文字列です)を導入するために使用されず、特定の文字が言語で持つ特別な意味を削除するために使用されます。

たとえば、

printf '%s\n' 'is debug'

引用符(ここでは"..."拡張内容を含めるためによりよく予約されているため、一重引用符が使用されます)は、バックスラッシュ文字(シェル構文の引用符演算子でもある)や空白文字などのシェルの特別な意味を削除するために使用されます。 、引数はコマンドを区切るために使用されます。

特別な意味を維持する必要がある文字を除くすべての内容を引用することもできます。

'printf' '%s\n' 'is debug'

または:

\p\r\i\n\t\f \%\s\\\n \i\s\ \d\e\b\u\g

3つのパラメータを区切る2つのスペースを除くすべての文字は引用符で囲まれています。

あるいは、特別な意味を失う必要があるものを引用してください。

printf %s'\'n is' 'debug

または:

printf %s\\n is\ debug

これは最終的にまったく同じことを行うシェル構文です。つまり、および3つの別々の引数をprintf使用してコマンドを実行します。printf%s\nis debug

カンマを引用符の内外に移動することがまったく違いがない理由を明確に説明してください。カンマは中括弧の拡張や算術式の一部として使用されないため、シェル構文に特別な意味はありません。

さまざまなシェルの特殊文字と引用符演算子の詳細については、次を参照してください。Unixシェルで通常の文字などの特殊文字を使用する方法は?

関連情報