この章では、シェル引用メカニズムについて詳しく説明します。メタキャラクタについて議論することから始めます。
メタキャラクター
Unix Shellは、特別な意味を持つさまざまなメタキャラクタを提供していますが、シェルスクリプトでそれらを使用すると、引用符で囲まれないと終了します
たとえば、?ディレクトリ内のファイルをリストしている間に1文字と一致し、*は複数の文字と一致します。ほとんどのシェル特殊文字(メタキャラクタとも呼ばれます)のリストは次のとおりです。
* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab
キャラクタは、その前に\を付けて引用することができます(つまり、それ自体のために立つことができます)。
例
次の例は、*または?を印刷する方法を示しています。 –
#!/bin/sh echo Hello; Word
実行時には、次の結果が表示されます。
Hello ./test.sh: line 2: Word: command not found shell returned 127
引用符で囲まれた文字を使ってみましょう。
#!/bin/sh echo Hello\; World
実行時には、次の結果が表示されます。
Hello; World
$の記号は、メタ文字の一つであり、シェルによって特別な処理を回避するために、引用符で囲む必要があります-
#!/bin/sh echo "I have \100円"
実行時には、次の結果が表示されます。
I have 100円
シングルクォート
多くの特殊なシェル文字を含むechoコマンドを考えてみましょう。
echo <-$1500.**>; (update?) [y|n]
それぞれの特殊文字の前にバックスラッシュを置くのは面倒ですし、よみずらいですね。
echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]
大きな文字グループを簡単に引用する方法があります。文字列の最初と最後に一重引用符( ‘)を入れる とうまく印刷することができます。
echo '<-$1500.**>; (update?) [y|n]'
一重引用符内の文字は、バックスラッシュが各文字の前にあるかのように引用されます。これにより、echoコマンドが適切な方法で表示されます。
出力する文字列の中に一重引用符が含まれている場合は、文字列全体を一重引用符で囲むのではなく、次のようにバックスラッシュ(\)を使用してください。
echo 'It\'s Shell Programming'
二重引用符
次のシェルスクリプトを実行してみてください。このシェルスクリプトは一重引用符を使用します。
VAR=ZARA echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
実行時には、次の結果が表示されます。
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
これは表示されるべきものではありません。一重引用符は変数の置換を妨げることは明らかです。変数値を代入して、逆コンマを期待通りに機能させたい場合は、次のようにコマンドを二重引用符で囲む必要があります。
VAR= KEN echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"
実行時には、次の結果が表示されます。
KEN owes <-$1500.**>; [ as of (07/02) ]
二重引用符は、以下を除くすべての文字の特別な意味を取り除きます –
- パラメータ置換のための$
- コマンド置換のためのバッククォート
- リテラルのドル記号を有効にするには\ $
- \ `リテラルバッククォートを有効にする
- \ “埋め込み二重引用符を有効にする
- \\埋め込みバックスラッシュを有効にする
- 他のすべての\文字はリテラル(特別なものではない)
一重引用符内の文字は、バックスラッシュが各文字の前にあるかのように引用されます。これにより、エコーコマンドが正しく表示されます。
出力する文字列の中に一重引用符が含まれている場合は、文字列全体を一重引用符で囲むのではなく、次のようにバックスラッシュ(\)を使用してください。
echo 'It\'s Shell Programming'
バッククォート
シェルコマンドをバッククォートの間に置くと、コマンドが実行されます。
構文
シェルコマンドをバッククォートの間に置く簡単な構文は次のとおりです。
構文
var = `command`
例
日付のコマンドは、次の例で実行され、生成された結果は、データ変数に格納されています。
DATE=`date` echo "Current Date: $DATE"
実行時には、次の結果が表示されます。
Current Date: Thu Jul 2 05:28:45 MST 2009