ラップトップ上のテキストでいっぱいのLinux端末。

Linux、macOS、またはその他のUNIXライクなシステムでBashシェルをマスターしたい場合は、特殊文字(〜、*、|、>など)が重要です。 これらの不可解なLinuxコマンドシーケンスを解明し、象形文字のヒーローになるのをお手伝いします。

特殊文字とは?

Bashシェルが2つの異なる方法で処理する文字のセットがあります。 それらをシェルで入力すると、それらは指示またはコマンドとして機能し、特定の機能を実行するようにシェルに指示します。 それらを1文字のコマンドと考えてください。

場合によっては、文字を印刷したいだけで、魔法の記号として機能させる必要はありません。 特殊な機能ではなく、文字を使用して自分自身を表現する方法があります。

どの文字が「特殊」または「メタ」文字であるか、またそれらを機能的および文字通りどのように使用できるかを示します。

〜ホームディレクトリ

チルダ(〜)は、ホームディレクトリの省略形です。 これは、コマンドにホームディレクトリへのフルパスを入力する必要がないことを意味します。 ファイルシステムのどこにいても、次のコマンドを使用してホームディレクトリに移動できます。

cd〜
端末ウィンドウの「cd〜」コマンド。

このコマンドを相対パスで使用することもできます。 たとえば、ファイルシステムのホームフォルダー以外の場所にいて、作業ディレクトリのアーカイブディレクトリに移動する場合は、チルドを使用して実行します。

cd〜/ work / archive
端末ウィンドウの「cd〜/ work / archive」コマンド。

。 カレントディレクトリ

ピリオド(。)は現在のディレクトリを表します。 lsで-a(すべて)オプションを使用すると、ディレクトリリストに表示されます。

ls -a
端末ウィンドウの「ls -a」コマンド。

コマンドでピリオドを使用して、現在のディレクトリへのパスを表すこともできます。 たとえば、現在のディレクトリからスクリプトを実行する場合は、次のように呼び出します。

./script.sh

これは、現在のディレクトリでscript.shファイルを探すようにBashに指示します。 このようにして、一致する実行可能ファイルまたはスクリプトをパス内のディレクトリで検索しません。

端末ウィンドウの「./script.sh」コマンド。

..親ディレクトリ

二重ピリオドまたは「二重ドット」(..)は、現在のディレクトリの親ディレクトリを表します。 これを使用して、ディレクトリツリーの1つ上のレベルに移動できます。

CD ..
端末ウィンドウの「cd ..」コマンド。

このコマンドを相対パスで使用することもできます。たとえば、ディレクトリツリーで1つ上のレベルに移動し、そのレベルで別のディレクトリに入る場合などです。

このテクニックを使用して、現在のディレクトリツリーと同じレベルのディレクトリにすばやく移動することもできます。 1つ上のレベルに移動し、次に1つ下のレベルに移動します。

cd ../gc_help
端末ウィンドウの「cd ../gc_help」コマンド。

/パスディレクトリセパレータ

スラッシュ(/)(スラッシュと呼ばれることも多い)を使用して、パス名のディレクトリを区切ることができます。

ls〜/ work / archive
端末ウィンドウの「ls〜/ work / archive」コマンド。

1つのスラッシュは、可能な最短のディレクトリパスを表します。 Linuxディレクトリツリーのすべてがルートディレクトリから始まるため、次のコマンドを使用してルートディレクトリにすばやく移動できます。

cd /
端末ウィンドウの「cd /」コマンド。

#コメントまたはトリム文字列

ほとんどの場合、ハッシュまたは番号記号(#)を使用して、その後に続くのがコメントであることをシェルに伝えます。 シェルスクリプトで使用できますが、あまり役に立ちませんが、コマンドラインでも使用できます。

#これはBashシェルによって無視されます
端末ウィンドウの「#」コマンド。

ただし、コマンド履歴に追加されるため、実際には無視されません。

ハッシュを使用して文字列変数をトリミングし、最初から一部のテキストを削除することもできます。 このコマンドは、this_stringという文字列変数を作成します。

この例では、「Dave Geek!」というテキストを割り当てます。 変数に。

this_string = "Dave Geek!"
端末ウィンドウでの「this_string = 'Dave Geek!'」コマンド。

このコマンドは、エコーを使用して、「ハウツー」という単語をターミナルウィンドウに出力します。 パラメータ展開を介して文字列変数に格納されている値を取得します。 ハッシュとテキスト「Dave」を追加するので、エコーに渡される前に、文字列のその部分が削除されます。

echo How-To $ {this_string#Dave}
端末ウィンドウでの「echo How-To $ {this_string#Dave}」コマンド。

これは文字列変数に格納されている値を変更しません。 エコーに送信されるものにのみ影響します。 echoを使用して文字列変数の値をもう一度出力し、これを確認できます。

$ this_stringをエコー
端末ウィンドウの「echo $ this_string」コマンド。

? 1文字のワイルドカード

Bashシェルは3つのワイルドカードをサポートしています。そのうちの1つは疑問符(?)です。 ワイルドカードを使用して、ファイル名テンプレートの文字を置き換えます。 ワイルドカードを含むファイル名は、1つではなく一連のファイル名に一致するテンプレートを形成します。

疑問符のワイルドカードは、正確に1文字を表します。 次のファイル名テンプレートを検討してください。

lsバッジ?.txt

これは、「「badge」で始まり、ファイル名拡張子の前に単一の文字が続く名前のファイルを一覧表示する」と解釈されます。

以下のファイルと一致します。 ファイル名の「バッジ」部分の後に番号が付いているものと文字が付いているものがあることに注意してください。 疑問符のワイルドカードは、文字と数字の両方に一致します。

端末ウィンドウの「lsバッジ?.txt」コマンド。

ただし、そのファイル名テンプレートは「badge.txt」と一致しません。これは、ファイル名の「バッジ」とファイル拡張子の間に単一の文字がないためです。 疑問符のワイルドカードは、ファイル名の対応する文字と一致する必要があります。

疑問符を使用して、ファイル名に特定の文字数を含むすべてのファイルを検索することもできます。 これは、ファイル名に正確に5文字を含むすべてのテキストファイルをリストします。

ls ?????。txt
端末ウィンドウでの「ls ?????。txt」コマンド。

*文字シーケンスワイルドカード

アスタリスク(*)ワイルドカードを使用して、文字を含まない任意の文字シーケンスを表すことができます。 次のファイル名テンプレートを検討してください。

lsバッジ*

これは次のすべてに一致します。

端末ウィンドウの「lsバッジ*」コマンド。

ワイルドカードは文字のシーケンスを表すか、文字を表さないため、「badge.txt」と一致します。

このコマンドは、ファイル拡張子に関係なく、「ソース」と呼ばれるすべてのファイルと一致します。

ls source。*
端末ウィンドウでの「ls source。*」コマンド。

[]文字セットワイルドカード

上記で説明したように、疑問符を使用して単一の文字を表し、アスタリスクを使用して文字のシーケンス(文字なしを含む)を表します。

角かっこ([])とワイルドカードに含まれる文字を使用してワイルドカードを形成できます。 ファイル名の関連文字は、ワイルドカード文字セットの文字の少なくとも1つと一致する必要があります。

この例では、コマンドは次のように変換されます。「拡張子が「.png」のファイル、ファイル名が「pipes_0」で始まり、次の文字が2、4、または6のいずれか」

ls badge_0 [246] .txt
端末ウィンドウでの「ls badge_0 [246] .txt」コマンド。

ファイル名テンプレートごとに複数のブラケットのセットを使用できます。

lsバッジ_ [01] [789] .txt
端末ウィンドウでの「ls badge_ [01] [789] .txt」コマンド。

文字セットに範囲を含めることもできます。 次のコマンドは、ファイル名に21から25、31から35までの番号が付いたファイルを選択します。

lsバッジ_ [23] [1-5] .txt
端末ウィンドウでの「ls badge_ [23] [1-5] .txt」コマンド。

; シェルコマンドセパレータ

コマンドラインには、セミコロン(;)で区切ってコマンドをいくつでも入力できます。 次の例でこれを行います。

ls> count.txt; wc -l count.txt; rm count.txt
端末ウィンドウでの「ls> count.txt; wc -l count.txt; rm count.txt」コマンド

2番目のコマンドは最初のコマンドが失敗した場合でも実行され、3番目のコマンドは2番目のコマンドが失敗した場合でも実行される、というように続きます。

1つのコマンドが失敗した場合に一連の実行を停止する場合は、セミコロンの代わりに2つのアンパサンド(&&)を使用します。

cd ./doesntexist && cp〜/ Documents / reports / *。
端末ウィンドウでの「cd ./doesntexist && cp〜/ Documents / reports / *。」コマンド。

&バックグラウンドプロセス

ターミナルウィンドウにコマンドを入力して完了すると、コマンドプロンプトに戻ります。 通常、これには1、2秒しかかかりません。 ただし、geditなどの別のアプリケーションを起動すると、アプリケーションを閉じるまでターミナルウィンドウを使用できません。

ただし、アプリケーションをバックグラウンドプロセスとして起動し、ターミナルウィンドウを引き続き使用できます。 これを行うには、コマンドラインにアンパサンドを追加します。

gedit command_address.page&
端末ウィンドウの「gedit command_address.page&」コマンド。

bashは起動したプロセスのプロセスIDを表示し、コマンドラインに戻ります。 その後、ターミナルウィンドウを引き続き使用できます。

<入力リダイレクト

多くのLinuxコマンドは、ファイルをパラメーターとして受け入れ、そのファイルからデータを取得します。 これらのコマンドのほとんどは、ストリームから入力を受け取ることもできます。 ストリームを作成するには、次の例に示すように、左山かっこ(<)を使用して、ファイルをコマンドにリダイレクトします。

ソート端末ウィンドウでの「sort <words.txt」コマンド。

コマンドに入力がリダイレクトされると、名前付きファイルから読み取る場合とは動作が異なる場合があります。

wcを使用してファイル内の単語、行、文字を数えると、値とファイル名が出力されます。 ファイルの内容をwcにリダイレクトすると、同じ数値が出力されますが、データの送信元のファイルの名前はわかりません。 ファイル名は出力できません。

以下に、wcの使用例をいくつか示します。

wc words.txt
wc 端末ウィンドウでの「wc words.txt」コマンド。

>出力リダイレクト

直角括弧(>)を使用して、コマンドからの出力を(通常はファイルに)リダイレクトできます。 ここに例があります:

ls> files.txt
cat files.txt
端末ウィンドウでの「ls> files.txt」コマンド。

>で数字(この例では2)を使用すると、出力リダイレクトはエラーメッセージをリダイレクトすることもできます。 方法は次のとおりです。

wc doestexist.txt 2> errors.txt
猫errors.txt
ターミナルウィンドウでの「wc Doestexist.txt 2> errors.txt」コマンド。

関連:Linuxのstdin、stdout、stderrとは何ですか?

| パイプ

「パイプ」はコマンドを一緒にチェーンします。 1つのコマンドから出力を受け取り、それを次の入力に送ります。 パイプされるコマンドの数(チェーンの長さ)は任意です。

ここでは、catを使用して、words.txtファイルの内容をgrepにフィードします。grepは、小文字または大文字の「C」を含む行を抽出します。 次に、grepはこれらの行をソートに渡します。 sortは-r(逆)オプションを使用しているため、ソートされた結果は逆の順序で表示されます。

次のように入力しました。

猫words.txt | grep [cC] | ソート-r
ターミナルウィンドウでの「cat words.txt | grep [cC] | sort -r」コマンド。

! パイプライン論理NOTおよび履歴演算子

感嘆符(!)は、NOTを意味する論理演算子です。

このコマンドラインには2つのコマンドがあります。

[! -d ./backup] && mkdir ./backup
  • 最初のコマンドは角括弧内のテキストです。 2番目のコマンドは、二重のアンパーサンド&&に続くテキストです。

最初のコマンドは! 論理演算子として。 角括弧は、テストが行​​われることを示しています。 -d(ディレクトリ)オプションは、backupというディレクトリの存在をテストします。 2番目のコマンドは、ディレクトリを作成します。

2つのアンパサンドで2つのコマンドが区切られるため、Bashは最初のコマンドが成功した場合にのみ2番目のコマンドを実行します。 しかし、それは私たちが必要とするものの反対です。 「backup」ディレクトリのテストが成功した場合は、作成する必要はありません。 また、「backup」ディレクトリのテストが失敗した場合、2番目のコマンドは実行されず、見つからないディレクトリは作成されません。

ここが論理演算子です! 入ります。論理NOTとして機能します。 したがって、テストが成功した場合(つまり、ディレクトリが存在する場合)、! それを「成功しない」、つまり失敗に切り替えます。 したがって、2番目のコマンドはアクティブ化されません。

ディレクトリテストが失敗した場合(つまり、ディレクトリが存在しない場合)、! 応答を「NOT失敗」、つまり成功に変更します。 したがって、不足しているディレクトリを作成するコマンドが実行されます。

その少し! 必要なときにパンチをたくさん詰め込みます!

バックアップフォルダーのステータスを確認するには、次に示すように、lsコマンドと-l(長いリスト)および-d(ディレクトリ)オプションを使用します。

ls -l -dバックアップ
端末ウィンドウでの「[!-d ./backup] && mkdir ./backup」コマンド。

感嘆符を使用して、コマンド履歴からコマンドを実行することもできます。 historyコマンドはコマンド履歴を一覧表示し、次に、!で再実行するコマンドの番号を入力します。 以下に示すように、それを実行するには:

!24
端末ウィンドウでの「!24」コマンド。

以下は、前のコマンドを再実行します。

!!

$変数式

Bashシェルでは、値を保持する変数を作成します。 環境変数などの一部は常に存在し、ターミナルウィンドウを開いたときにいつでもアクセスできます。 これらは、ユーザー名、ホームディレクトリ、パスなどの値を保持します。

echoを使用して、変数が保持する値を確認できます。以下に示すように、変数名の前にドル記号($)を付けるだけです。

$ USERをエコー
エコー$ HOME
エコー$ PATH
端末ウィンドウでの「echo $ USER」コマンド。

変数を作成するには、変数に名前を付け、保持する値を指定する必要があります。 変数を作成するためにドル記号を使用する必要はありません。 次の例のように、変数を参照するときにのみ$を追加します。

ThisDistro = Ubuntu
MyNumber = 2001
echo $ ThisDistro
$ MyNumberをエコー
端末ウィンドウでの「ThisDistro = Ubuntu」コマンド。

ドル記号の前後に中括弧({})を追加し、パラメーター展開を実行して変数の値を取得し、値をさらに変換できるようにします。

これにより、次に示すように、文字列を保持する変数が作成されます。

MyString = 123456qwerty

次のコマンドを使用して、文字列をターミナルウィンドウにエコーします。

エコー$ {MyString}

文字列全体の位置6から始まる部分文字列を返すには、次のコマンドを使用します(ゼロオフセットがあるため、最初の位置はゼロです)。

エコー$ {myString:6}

位置0で始まり、次の6文字を含む部分文字列をエコーする場合は、次のコマンドを使用します。

エコー$ {myString:0:6}

次のコマンドを使用して、位置4で始まり、次の4文字を含む部分文字列をエコーし​​ます。

エコー$ {myString:4:4}
端末ウィンドウでの「MyString = 123456qwerty」コマンド。

特殊文字の引用

特殊文字をリテラル(非特殊)文字として使用する場合は、Bashシェルに指示する必要があります。 これはクォーティングと呼ばれ、3つの方法があります。

テキストを引用符( "…")で囲むと、Bashがほとんどの特殊文字に作用することがなくなり、印刷されるだけです。 ただし、1つの注目すべき例外は、ドル記号($)です。 変数式の文字として機能するため、変数の値を出力に含めることができます。

たとえば、次のコマンドは日付と時刻を出力します。

echo「今日は$(date)です」

以下に示すようにテキストを単一引用符( '…')で囲むと、すべての特殊文字の機能が停止します。

echo '今日は$(date)'です

バックスラッシュ(\)を使用して、後続の文字が特殊文字として機能しないようにすることができます。 これはキャラクターの「エスケープ」と呼ばれます。 以下の例を参照してください。

echo「今日は\ $(date)です」
ターミナルウィンドウでの

特殊文字は非常に短いコマンドと考えてください。 それらの使用法を覚えておくと、Bashシェル(および他の人のスクリプト)を非常に理解しやすくなります。

関連:37知っておくべき重要なLinuxコマンド