name=Jackson
echo $name
これはジャクソンを示しています。
name="Jackson"
echo $name
ジャクソンも披露する予定だ。
そのため、変数の周りに引用符を入れると文字列になるとします。厳密に言えば、name = Jacksonとは何ですか?文字列としても認識されますか?
答え1
Linux環境変数は常に文字列です。文字列に特殊文字(シェルメタ文字またはスペース)が含まれている場合にのみ引用符が必要です。シェルメタ文字は次のとおりです。
<>()[]{}*?$|&#\;`'"
$、\、および`の場合、二重引用符はその中で拡張されるため十分ではありません。ここでは、単一引用符を使用するか、\でエスケープする必要があります。
コメントで指摘したように、bashには特別な型の変数がありますが、ほとんど必要ではなく、すべてのbash変数も基本的に文字列です。
答え2
Bashは強力なタイプではありません。1唯一の重要な違いは、スカラー型と複合型(配列)の間です。 スカラーは常に文字列として扱われます。しかし、算術的に使用できる "数値文字列"があります。
a="5"
b=10
echo "$a + $b = "$(($a+$b));
「数値文字列」は数値のみを含む文字列なので、整数値に変換できます。 Bashのすべてのスカラー値はまだ文字列にすぎず、ここにある声明の言及は関係ありません。 a=5
まったく同じですa="5"
。 (たとえば)比較して$a
使用すると、数値として扱われます。比較に使用する場合はアルファベット順に処理されます。決定は変数の特性ではなく演算子/コンテキストです。$b
-lt
<
宣言された値が算術式として解釈されるようにする「整数フラグ」を使用して変数を宣言することもできます。
x=10/2
echo "$x" # output: 10/2
declare -i x=10/2
echo "$x" # output: 5
declare -i x=what
echo "$x" # output: 0
その後、この変数に割り当てられたすべての項目は算術的に解釈されます。
a=5
declare -i b=10
a=$a/5
b=$b/5
echo "$a $b" #output: 5/5 2
a=hello
b=world
echo $a$b #output hello0
しかし、変数の内容はまだ(数字)文字列です。整数フラグは文字列の内容を制限し、文字列に割り当てられた値の解釈に影響します。
1これは、宣言された整数の場合に見られるように、単純な動的型ではありません。たぶん私たちはそれを何かと呼ぶかもしれませんアヒルタイピング、またはによるとBash Advanced Scripting Guide、「タイプはありません」。
答え3
違いがあります。試してみてください。
unset name
name="Michael Jackson" ; echo "$name"
そして
unset name #to reset name, see comments
name=Michael Jackson ; echo "$name"
これは非常に異なります。次に、「Jackson」コマンドを実行し、「name = Michael」環境を渡します。したがって、「Jackson:コマンドが見つかりません」というメッセージが表示されます。次の行の一部は「jackson」コマンド(およびそのコマンドのみ)にのみ渡されるため、「リセット」名にunset name
「リセット」名を追加する必要があります。name=Michael
呼び出しシェルレベルでは実行されません! (したがって、name="Michael Jackson"
2回目の試行の前に最初のコマンドにリセットしない場合は、""
まだ最初のコマンドが含まれます。したがって、最初の試みを忘れていない場合は、「echo $name」はまだPeopleを作成します。混乱して「Michael Jackson」を表示します。)
通常、いつも定義するとき、特に変数を使用する場合は二重引用符を使用してください。
cd "${var}"
比較する
cd $var
2番目のバージョンは、$ varが定義されていない場合は抗議するのではなく、自動的にhomedirに移動します。
その後、周囲の二重引用符を削除した場合にのみ知るあなたは必要変数の各要素を次のように区切ります。
for i in $var ; do something_using_i ; done