重要なポイント
- 特殊文字は多くの場合、コマンドの省略表現のように機能し、より長く冗長なコマンドを入力しなくても特定の機能を実行するように Bash に指示します。
- チルダ (~) はホーム ディレクトリを指し、2 つのピリオド (..) は親ディレクトリを指し、1 つのピリオド (.) は現在のディレクトリを指します。
- その他の重要な文字 / ディレクトリ区切り、#、コメント、?ワイルドカード文字の場合、;コマンドを区切るための |コマンドを一緒にパイプするためのものです。
Linux、macOS、または別の UNIX 系システムで Bash シェルをマスターし たい場合は、特殊文字 (~、*、|、> など) が重要です。私たちは、あなたがこれらの不可解な Linux コマンド シーケンスを解明し、象形文字の英雄になれるようお手伝いします。
特殊文字とは何ですか?
Bash シェルが 2 つの異なる方法で処理する一連の文字があります。これらをシェルに入力すると、それらは命令またはコマンドとして機能し、シェルに特定の機能を実行するように指示します。これらは単一文字のコマンドと考えてください。
場合によっては、文字を印刷したいだけで、それを魔法のシンボルとして機能させる必要がない場合があります。文字を、その特別な機能ではなくそれ自体を表すために使用する方法があります。
どの文字が「特殊」文字または「メタ」文字であるか、またそれらの文字を機能的および文字通りに使用する方法を示します。
~ ホームディレクトリ
チルダ (~) はホーム ディレクトリの短縮形です。これは、コマンドでホーム ディレクトリへのフル パスを入力する必要がないことを意味します。ファイルシステム内のどこにいても、次のコマンドを使用してホーム ディレクトリに移動できます。
CD〜
このコマンドを相対パスとともに使用することもできます。たとえば、ホーム フォルダーの下ではないファイル システムのどこかにいて、
work
ディレクトリ内の
archive
ディレクトリに変更したい場合は、チルダを使用して変更します。
cd ~/作品/アーカイブ
。カレントディレクトリ
ピリオド (.) は現在のディレクトリを表します。
ls
で
-a
(all) オプションを使用すると、ディレクトリのリストに表示されます。
ls -a
コマンドでピリオドを使用して、現在のディレクトリへのパスを表すこともできます。たとえば、現在のディレクトリからスクリプトを実行する場合は、次のように呼び出します。
./script.sh
これにより、Bash は現在のディレクトリで
script.sh
ファイルを探すように指示されます。この方法では、一致する実行可能ファイルまたはスクリプトをパス内のディレクトリで検索することはありません。
.. 親ディレクトリ
二重ピリオドまたは「二重ドット」(..) は、現在のディレクトリの親ディレクトリを表します。これを使用すると、ディレクトリ ツリー内で 1 つ上のレベルに移動できます。
CD ..
このコマンドを相対パスで使用することもできます。たとえば、ディレクトリ ツリーで 1 つ上のレベルに移動し、そのレベルの別のディレクトリに移動する場合などです。
この手法を使用して、ディレクトリ ツリー内の現在のディレクトリと同じレベルのディレクトリにすばやく移動することもできます。 1 レベル上がってから、1 レベル下がって別のディレクトリに戻ります。
cd ../gc_help
/ パス ディレクトリ区切り文字
スラッシュ (/) (単にスラッシュと呼ばれることもよくあります) を使用して、パス名のディレクトリを区切ることができます。
ls ~/work/archive
1 つのスラッシュは、可能な限り最短のディレクトリ パスを表します。 Linux ディレクトリ ツリー内のすべてはルート ディレクトリから始まるため、次のコマンドを使用してルート ディレクトリにすばやく移動できます。
CD /
# コメントまたは文字列のトリミング
ほとんどの場合、ハッシュまたはシャープ記号 (#) を使用して、その後に続くものはコメントであり、コメントには作用しないことをシェルに指示します。これはシェル スクリプトでも使用できますが、あまり役に立ちませんがコマンド ラインでも使用できます。
# これは Bash シェルによって無視されます
ただし、コマンド履歴に追加されるため、完全に無視されるわけではありません。
ハッシュを使用して文字列変数をトリミングし、先頭から一部のテキストを削除することもできます。このコマンドは、
this_string
という文字列変数を作成します。
この例では、「Dave Geek!」というテキストを割り当てます。変数に。
this_string="デイブ オタク!"
このコマンドは、
echo
使用して「How-To」という単語を端末ウィンドウに出力します。
パラメータ展開を
介して、文字列変数に格納されている値を取得します。ハッシュとテキスト「Dave」を追加するため、文字列のその部分は
echo
に渡される前に切り取られます。
echo のハウツー ${this_string#Dave}
これによって、文字列変数に格納されている値は変更されません。
echo
に送信されるものにのみ影響します。
echo
を使用して文字列変数の値をもう一度出力し、これを確認します。
$this_string をエコーする
?単一文字の Bash ワイルドカード
Bash シェルは 3 つのワイルドカードをサポートしており、そのうちの 1 つは疑問符 (?) です。ワイルドカードを使用して、ファイル名テンプレート内の文字を置き換えます。ワイルドカードを含むファイル名は、1 つのファイル名だけではなく、さまざまなファイル名に一致するテンプレートを形成します。
疑問符ワイルドカードは 1 文字だけを表します。次のファイル名テンプレートを考えてみましょう。
バッジ?.txt
これは、「’badge’ で始まり、ファイル名拡張子の前に任意の 1 文字が続く名前を持つファイルをリストする」と解釈されます。
以下のファイルと一致します。ファイル名の「バッジ」部分の後に数字が付いているものと文字が付いているものがあることに注意してください。疑問符ワイルドカードは文字と数字の両方に一致します。
ただし、ファイル名の「badge」とファイル拡張子の間に 1 文字も含まれていないため、このファイル名テンプレートは「badge.txt」とは一致しません。疑問符ワイルドカードは、ファイル名の対応する文字と一致する必要があります。
疑問符を使用して、ファイル名に特定の文字数を含むすべてのファイルを検索することもできます。これは、ファイル名にちょうど 5 文字を含むすべてのテキスト ファイルをリストします。
?????.txt
* 文字シーケンス Bash ワイルドカード
アスタリスク (*) ワイルドカードを使用して、文字を含まない任意の文字列を表すことができます。次のファイル名テンプレートを考えてみましょう。
バッジ*
これは次のすべてに一致します。
ワイルドカードは任意の文字のシーケンスを表すか、文字を表さないため、「badge.txt」と一致します。
このコマンドは、ファイル拡張子に関係なく、「source」と呼ばれるすべてのファイルと一致します。
ソース。*
[] 文字セット ワイルドカード
上で説明したように、単一の文字を表すには疑問符を使用し、一連の文字 (文字を含まない場合も含む) を表すにはアスタリスクを使用します。
角括弧 ( [] ) とそれに含まれる文字を使用してワイルドカードを作成できます。ファイル名の関連する文字は、ワイルドカード文字セット内の文字の少なくとも 1 つと一致する必要があります。
この例では、コマンドは「拡張子が「.png」で、ファイル名が「pipes_0」で始まり、次の文字が 2、4、または 6 である任意のファイル」と変換されます。
ls バッジ_0[246].txt
ファイル名テンプレートごとに複数の括弧のセットを使用できます。
ls バッジ_[01][789].txt
文字セットに範囲を含めることもできます。次のコマンドは、ファイル名に 21 ~ 25 と 31 ~ 35 の番号を持つファイルを選択します。
ls バッジ_[23][1-5].txt
;シェルコマンド区切り文字
コマンド ラインには、各コマンドをセミコロン (;) で区切れば、好きなだけ入力できます。次の例でこれを実行します。
ls > count.txt; wc -l count.txt; rm カウント.txt
2 番目のコマンドは最初のコマンドが失敗しても実行され、3 番目のコマンドは 2 番目のコマンドが失敗した場合でも実行され、以下同様であることに注意してください。
1 つのコマンドが失敗した場合に一連の実行を停止する場合は、セミコロンの代わりに 2 つのアンパサンド (&&) を使用します。
cd ./doesntexist && cp ~/Documents/reports/* .
バックグラウンドプロセスと
ターミナル ウィンドウにコマンドを入力して完了すると、コマンド プロンプトに戻ります。通常、これには 1 ~ 2 秒しかかかりません。ただし、
gedit
などの別のアプリケーションを起動した場合は、アプリケーションを閉じるまでターミナル ウィンドウを使用できません。
ただし、アプリケーションをバックグラウンド プロセスとして起動し、ターミナル ウィンドウを引き続き使用することはできます。これを行うには、コマンド ラインにアンパサンドを追加するだけです。
gedit コマンドアドレス.ページ &
Bash は起動したもののプロセス ID を表示し、コマンド ラインに戻ります。その後、ターミナル ウィンドウを引き続き使用できます。
< 入力リダイレクト
多くの Linux コマンドは、ファイルをパラメータとして受け入れ、そのファイルからデータを取得します。これらのコマンドのほとんどは、ストリームから入力を受け取ることもできます。ストリームを作成するには、次の例に示すように左山かっこ ( < ) を使用して、ファイルをコマンドにリダイレクトします。
並べ替え < 単語.txt
コマンドの入力がコマンドにリダイレクトされると、名前付きファイルから読み取る場合とは動作が異なる場合があります。
wc
を使用してファイル内の単語、行、文字をカウントすると、値が出力され、次にファイル名が出力されます。ファイルの内容を
wc
にリダイレクトすると、同じ数値が出力されますが、データの送信元のファイルの名前はわかりません。ファイル名を出力することはできません。
wc
使用方法の例をいくつか示します。
トイレの言葉.txt
トイレ < 単語.txt
> 出力リダイレクト
右山括弧 ( > ) を使用すると、コマンドからの出力を (通常はファイルに) リダイレクトできます。以下に例を示します。
ls > files.txt
猫ファイル.txt
>
とともに数字 (この例では 2) を使用すると、出力リダイレクトでエラー メッセージもリダイレクトできます。その方法は次のとおりです。
wc doesntexist.txt 2>errors.txt
猫のエラー.txt
|パイプ
「パイプ」はコマンドを連鎖させます。 1 つのコマンドから出力を取得し、それを入力として次のコマンドに送ります。パイプされたコマンドの数 (チェーンの長さ) は任意です。
ここでは、
cat
使用して、words.txt ファイルの内容を
grep
に送り込み、小文字または大文字の「C」を含む行を抽出します。
grep
これらの行を
sort
に渡します。
sort
では
-r
(逆順) オプションが使用されているため、ソート結果は逆順に表示されます。
次のように入力しました。
猫の言葉.txt | grep [cC] |並べ替え -r
!パイプライン論理 NOT および履歴演算子
感嘆符 (!) は、NOT を意味する論理演算子です。
このコマンドラインには 2 つのコマンドがあります。
[ ! -d ./backup ] && mkdir ./backup
- 最初のコマンドは角括弧内のテキストです。
-
2 番目のコマンドは、2 つのアンパサンド
&&に続くテキストです。
最初のコマンドでは
!
論理演算子として。角括弧は、テストが行われることを示します。
-d
(ディレクトリ) オプションは、backup というディレクトリの存在をテストします。 2 番目のコマンドはディレクトリを作成します。
2 つのアンパサンドが 2 つのコマンドを区切っているため、Bash は最初のコマンドが成功した場合にのみ 2 番目のコマンドを実行します。しかし、それは私たちが必要としているものとは逆です。 「バックアップ」ディレクトリのテストが成功した場合は、それを作成する必要はありません。また、「バックアップ」ディレクトリのテストが失敗した場合、2 番目のコマンドは実行されず、不足しているディレクトリは作成されません。
ここで論理演算子
!
これは論理否定として機能します。したがって、テストが成功した場合 (つまり、ディレクトリが存在した場合)
!
それを「成功ではない」、つまり失敗に切り替えます。したがって、2 番目のコマンドはアクティブ化
されません
。
ディレクトリのテストが失敗した場合 (つまり、ディレクトリが存在しない場合)
!
応答が「失敗ではありません」、つまり成功に変わります。そこで、不足しているディレクトリを作成するコマンドが実行されます。
その小さな
!
必要なときにたくさんのパンチをパックします。
バックアップ フォルダーのステータスを確認するには、次に示すように、
ls
コマンドと、
-l
(長いリスト) および
-d
(ディレクトリ) オプションを使用します。
ls -l -d バックアップ
感嘆符を使用してコマンド履歴からコマンドを実行することもできます。
history
コマンドはコマンド履歴をリストし、再実行するコマンドの番号を
!
で入力します。以下に示すように、それを実行します。
!24
次のコマンドは、前のコマンドを再実行します。
!!
$ 変数式
Bash シェルでは、値を保持する変数を作成します。 環境変数などの一部の変数は 常に存在し、ターミナル ウィンドウを開いたときにいつでもアクセスできます。これらには、ユーザー名、ホーム ディレクトリ、パスなどの値が保持されます。
echo
使用すると、変数が保持する値を確認できます。以下に示すように、変数名の前にドル記号 ($) を付けるだけです。
エコー $USER
エコー $HOME
エコー $PATH
変数を作成するには、変数に名前を付け、保持する値を指定する必要があります。変数を作成するためにドル記号を使用する必要はありません。次の例のように、変数を参照する場合にのみ
$
を追加します。
ThisDistro=Ubuntu
私の番号=2001
$ThisDistroをエコーする
$MyNumber をエコーする
ドル記号の周りに中括弧 ( {} ) を追加し、パラメータ展開を実行して変数の値を取得し、値をさらに変換できるようにします。
これにより、以下に示すように、文字列を保持する変数が作成されます。
MyString=123456qwerty
次のコマンドを使用して、文字列をターミナル ウィンドウにエコーします。
エコー ${MyString}
文字列全体の位置 6 から始まる部分文字列を返すには、次のコマンドを使用します (ゼロオフセットがあるため、最初の位置はゼロです)。
エコー ${myString:6}
位置 0 から始まり次の 6 文字を含む部分文字列をエコーする場合は、次のコマンドを使用します。
エコー ${myString:0:6}
次のコマンドを使用して、位置 4 で始まり次の 4 文字を含む部分文字列をエコーします。
エコー ${myString:4:4}
特殊文字の引用符
特殊文字をリテラル (非特殊) 文字として使用したい場合は、Bash シェルに指示する必要があります。これは引用と呼ばれ、これを行うには 3 つの方法があります。
テキストを引用符 (「…」) で囲むと、Bash がほとんどの特殊文字を処理できなくなり、印刷されるだけになります。ただし、注目すべき例外の 1 つはドル記号 ($) です。これは変数式の文字として引き続き機能するため、出力に変数の値を含めることができます。
たとえば、次のコマンドは日付と時刻を出力します。
エコー「今日は$(日付)です」
以下に示すようにテキストを一重引用符 (‘…’) で囲むと、すべての特殊文字の機能が停止されます。
echo '今日は $(date) です'
バックスラッシュ ( \ ) を使用すると、後続の文字が特殊文字として機能しないようにすることができます。これはキャラクターの「エスケープ」と呼ばれます。以下の例を参照してください。
echo "今日は \$(日付) です"
特殊文字は非常に短いコマンドであると考えてください。これらの使用法を覚えておけば、Bash シェルや他の人のスクリプトの理解に非常に役立ちます。





