Unix / Linux - シェルの引用符メカニズム

こんにちは、将来のプログラマーたち!今日は、UnixとLinuxのシェルの引用符メカニズムという魅力的な世界に飛び込んでみましょう。あなたの近所の親切なコンピュータの先生として、私はこの旅をステップバイステップでガイドします。プログラミングの経験がない方も心配しないでください。私たちは非常に基本から始めて、少しずつ進んでいきます。コーヒー(またはあなたが好きなお茶)を一杯取り、始めましょう!

Unix / Linux - Quoting Mechanisms

メタキャラクター

引用符に飛び込む前に、メタキャラクターとは何かを理解する必要があります。シェルでは、メタキャラクターは特別な意味を持つ特殊なキャラクターです。あなたの好きな料理の調味料のようなものです。少しで効果が大きいです!

以下は一般的なメタキャラクターの表です:

メタキャラクター 意味
* ウイルドカード(任意の文字数を一致)
? ウイルドカード(任意の1文字を一致)
> 出力リダイレクション
< 入力リダイレクション
& バックグラウンドでコマンドを実行
; コマンドセパレータ
() コマンドをグループ化
[] 字符クラス

例を見てみましょう:

ls *.txt

このコマンドでは、*はメタキャラクターです。シェルにすべての.txtで終わるファイルをリストするように指示しています。すごいですね?

でも、これらのキャラクターを通常のキャラクターとして使用したい場合はどうでしょうか?それが引用符の登場です!

単引用符

単引用符は最もシンプルな引用符の形式です。シェルに、それ们の中のすべてをリテラルキャラクターとして扱うように指示します。あなたの言葉を守るプロテクティブなバブルにいるようなものです!

例を試してみましょう:

echo 'The * is a wildcard character'

出力:

The * is a wildcard character

見てください!*はすべてのファイルをリストするのではなく、通常のキャラクターとして処理されました。

単引用符は、文字列内の各キャラクターのリテラル値を保持したいときに非常に便利です。他の引用符キャラクターも単引用符の内側では特別な意味を失います!

echo 'This is a $VARIABLE with "double quotes" inside'

出力:

This is a $VARIABLE with "double quotes" inside

単引用符の内側のすべては、正確にそのまま表示されます。置換や解釈は一切ありません。純粋な、未加工のテキストです!

二重引用符

二重引用符は、単引用符よりも少し柔軟です。大多数のキャラクターのリテラル値を保持しますが、いくつかの置換を許可します。テキストの半透膜のようなものです!

以下は二重引用符が許可するもの:

  1. 変数置換
  2. コマンド置換
  3. バックスラッシュエスケープ

いくつかの例を見てみましょう:

NAME="Alice"
echo "Hello, $NAME!"

出力:

Hello, Alice!

変数$NAMEはその値に置換されました。魔法のようです!

次に、コマンド置換を試みます:

echo "Today's date is $(date)"

出力:

Today's date is Tue May 23 10:30:45 PDT 2023

$(date)の部分はdateコマンドの出力に置換されました。すごいですね?

しかし、二重引用符の内側でも、いくつかのキャラクターは特別な意味を保持します:

echo "This is a newline: \n And this is a tab: \t"

出力:

This is a newline:
And this is a tab:

\n\tはそれぞれ改行とタブとして解釈されました。

バッククォート

バッククォート、またはバックティックは、コマンド置換の古い形式です。Unixの初期の日々から来たタイムトラベラーのようです!

以下はその使い方です:

echo "The current directory contains `ls | wc -l` files"

出力:

The current directory contains 42 files

バッククォートの間のコマンド(ls | wc -l)は実行され、その出力が文字列に置換されます。

バッククォートはまだ動作しますが、より現代的な$()シンタックスが一般的に推奨されます:

echo "The current directory contains $(ls | wc -l) files"

これは同じことを行いますが、ネストしやすく、私の個人的な意見ですが、読みやすくなっています。フリーフォンからスマートフォンへのアップグレードのようなものです。基本的な機能は同じですが、よりユーザーフレンドリーです!

すべてを合わせて

これらすべての引用符メカニズムを探索したので、楽しい小さなスクリプトでそれ们を組み合わせてみましょう:

#!/bin/bash

NAME="World"
GREETING='Hello'
DATE=$(date +"%A, %B %d, %Y")

echo "$GREETING, $NAME!"
echo 'Today is not actually $DATE'
echo "But for real, today is $DATE"
echo "There are `ls | wc -l` files in this directory"

このスクリプトを実行すると、以下のような出力が得られるかもしれません:

Hello, World!
Today is not actually $DATE
But for real, today is Tuesday, May 23, 2023
There are 42 files in this directory

各種の引用符がどのように出力に影響を与えるかを理解できますか?単引用符はすべてをリテラルに保持し、二重引用符は置換を許可し、バッククォート(または$())はコマンド置換を行います。

そして、ここまでで、あなたはシェルの引用符メカニズムの世界への最初のステップを踏み出しました。練習は完璧を生みますので、これらの概念を試してみてください。すぐにプロのように引用符を使えるようになるでしょう!

ハッピーコーディング、そしてシェルがあなたとともに!??

Credits: Image by storyset