次のコードでは、 echo $d は値 0 を出力します
#!/bin/sh
printf "Enter the IP address: "
read server
a=":"
b="["
c="]"
d=$b$server$c
echo $d
すでに使用していますprintf
。printf
の代わりに使用してくださいecho
。これは問題なく機能します。
printf "Enter the IP address: "
read server
a=":"
b="["
c="]"
d="${b}${server}${c}"
printf "%s\n" $d
に問題があるときはいつでも、私が示しているのと同じようにecho
使用できます。printf
実際、エコーの代わりに使用することをお勧めします。次に例を示します。
echo -n "Enter a string: "
read string
echo "$string"
簡単そうに見え-foo
ますが、文字列として入力した場合はどうなりますか?エコーは失敗します。ただし、これは機能します。
printf "%s" "Enter a string: "
read string
printf "%s\n" $string
何を入力しても$string
。
$d
引用符と中括弧を使用して設定を変更しました。設定時に引用符を使用せずd
、誰かthis * is a string
があなたのIPアドレスを入力した場合、プログラムは*
ディレクトリ内のすべてのファイルに一致するように拡張されます。おそらくあなたが望まない何か。中括弧は、変数がすべてそのように押しつぶされているときに、変数を見やすくするだけです。さらに、おそらく各単語を独自の行に配置します。
this * is a test
IPアドレスとして入力し、$d
引用符なしで設定してから引用符付きで設定してみて、何が起こるかを確認してください。
引用符を付けずにecho
変数を指定すると、その内容はとりわけグロブ展開の影響を受けます。開き角括弧と閉じ角括弧の間に何かがあるグロブは、シェルからはその中の任意の文字の選択であるパターンとして認識されます。
ここにデモンストレーションがあります:
$ mkdir newdir
$ cd newdir
$ var='[192.168.0.1]'
$ echo $var # unquoted
[192.168.0.1]
$ touch 0
$ echo $var # unquoted
0
$ echo "$var" # quoted
[192.168.0.1]
ご覧のとおり、(touch
コマンドの後の) ディレクトリに "0" というファイルがあります。一致する角括弧内に「0」があります。角括弧内の文字列は文字列ではなく (変数が引用符で囲まれていない場合)、重複は無視されます。この例では、[192.680]
は同等です。
レッスン?ディレクトリに「0」という名前のファイルがあります。ソリューション?変数が消費されるときは常に変数を引用してください。