\r\n\r\n
Linux、macOS、その他のUNIX系システムでbashshellを使いこなすには、特殊文字(~、*、 |、>など)が不可欠です。この謎に満ちたLinuxのコマンドシーケンスを解き明かし、象形文字のヒーローになるためのお手伝いをします。
バッシュシェルでは、2種類の方法で文字のセットを処理します。シェルに入力すると、命令やコマンドとして機能し、シェルに特定の機能を実行するように指示します。一文字のコマンドと考えることができます。
文字を印刷したいだけで、マジックシンボルとして必要ない場合もあります。特殊な機能ではなく、文字そのものを表現するために使う方法があります。
どの文字が「特殊文字」「メタ文字」なのか、機能的かつ文字通りの使い方を紹介します。
波線記号(~)は、ホームディレクトリの略称です。つまり、コマンドにホームディレクトリのフルパスを入力する必要はありません。ファイルシステム上のどこからでも、このコマンドでホームディレクトリの
cd ~また、このコマンドは相対パスにも使用できます。例えば、ファイルシステム上のホームフォルダー以外の場所にいて、作業ディレクトリ内のアーカイブディレクトリに変更したい場合は、jaw文字を使用します。
cd ~/work/archiveピリオド(.)はカレントディレクトリを示す.ls で -a (all) オプションを使用すると,ディレクトリリストで見ることができる.
ls -aまた、コマンドのピリオドでカレントディレクトリへのパスを示すこともできます。例えば、カレントディレクトリからスクリプトを実行する場合は、次のように呼び出します。
./script.shこれは、カレント・ディレクトリにあるscript.shファイルを探すようにBashに指示します。この方法では、パス内のディレクトリで一致する実行ファイルやスクリプトを検索することはありません。
ダブルピリオドまたは「ダブルドット」(...)は、現在のディレクトリの親ディレクトリを示し、ディレクトリツリーを1レベル上に移動するときに使用します。
cd ..また、このコマンドは相対パスにも使えます。たとえば、ディレクトリツリーで1レベル上がって、そのレベルの別のディレクトリに入りたい場合などです。
また、この方法を使うと、カレントディレクトリと同じレベルのディレクトリに素早く移動することができます。
cd ../gc_helpパス名には、フォワードスラッシュ(/)-しばしばスラッシュと呼ばれる-を使用して、ディレクトリを区切ることができます。
ls ~/work/archiveフォワードスラッシュは、最短のディレクトリパスを示します。Linuxのディレクトリツリーはすべてルートから始まるので、次のコマンドですぐにルートディレクトリに移動することができます。
cd /多くの場合、ハッシュ記号や数字記号(#)を使って、その後に続くものがコメントであり、それに対するアクションを実行してはいけないことをシェルに伝えることができます。シェルスクリプトで使用することができますが、一方でコマンドラインではあまり役に立ちません。
# This will be ignored by the Bash shellしかし、コマンド履歴に追加されるため、実際には無視されることはありません。
また、ハッシュを使って文字列変数をトリミングし、先頭の一部のテキストを削除することができます。このコマンドは、Thisu stringという文字列変数を作成します。
この例では、"Dave Geek!"というテキストを変数に指定しています。
this_string="Dave Geek!"このコマンドは、echoを使って「How to」という単語をターミナルウィンドウに表示します。引数で展開し、文字列変数に格納されている値を取得する。ハッシュと "Dave "というテキストを付加しているので、この部分を切り落としてからechoに渡しているのです。
echo How-To ${this_string#Dave}これは、string変数に格納されている値を変更するのではなく、echoに送信される値にのみ影響します。echoで文字列変数の値をもう一度表示して、それを確認することができます。
echo $this_stringbashshellは3つのワイルドカードをサポートしており、そのうちの1つはクエスチョンマーク(?).ワイルドカードは、ファイル名テンプレートの文字を置き換えるために使用します。ワイルドカードを含むファイル名は、1つのファイル名だけでなく、ファイル名の範囲にマッチするテンプレートを形成します。
クエスチョンマークのワイルドカードは正確に1文字を表します。以下のファイル名テンプレートを考えてみましょう。
ls badge?.txtこれは、"名前が「バッジ」で始まり、ファイル拡張子の前に任意の一文字が続くファイルをリストアップする "と訳すことができます。
ファイル名の中には、"badge "の後に数字が付くものと、文字が付くものがありますのでご注意ください。
ファイル名のテンプレートは、"badge "とファイル拡張子の間に文字がないため、"badge.txt "に一致しません。クエスチョンマークのワイルドカードは、ファイル名の対応する文字と一致する必要があります。
また、クエスチョンマークを使用すると、ファイル名に特定の文字数を含むすべてのファイルを検索できます。この場合、ファイル名にちょうど5文字を含むすべてのテキストファイルがリストアップされます。
ls ?????.txtアスタリスク(*)のワイルドカード文字は、任意の文字を除いて、任意の文字列を示すために使用することができます。
ls badge*これは、以下の条件をすべて満たしています。
ワイルドカード文字は、任意の文字列または全くない文字を表すので、"badge.txt "にマッチします。
このコマンドは、ファイル拡張子に関係なく、"source "という名前のすべてのファイルにマッチします。
ls source.*前述のとおり、クエスチョンマークは任意の個別文字を、アスタリスクは任意の連続した文字(任意の文字を除く)を示す。
ワイルドカードは、角括弧([])とそれに含まれる文字で構成することができます。ファイル名の関連する文字は、ワイルドカードセットの少なくとも1文字と一致する必要があります。
この例では、「拡張子が".png "で、ファイル名が "pipesu 0 "で始まり、次の文字が2、4、6である任意のファイル」に変換されます。"
ls badge_0[246].txt1つのファイル名テンプレートに対して、複数の括弧を使用することができる。
ls badge_[01][789].txtまた、文字セットに範囲を含めることも可能です。次のコマンドは、ファイル名に21から25、31から35の数字を含むファイルを選択します。
ls badge_[23][1-5].txtコマンドラインには、各コマンドをセミコロン(;)で区切れば、いくつでもコマンドを入力できます。 次の例では、このようにします。
ls > count.txt; wc -l count.txt; rm count.txtなお、2番目のコマンドは1番目のコマンドに失敗しても実行され、3番目のコマンドは2番目のコマンドに失敗しても実行され、といった具合になります。
コマンドに失敗したときにシーケンスの実行を停止させるには、セミコロン:の代わりにダブルサイン(&&)を使用します。
cd ./doesntexist && cp ~/Documents/reports/* .ターミナルウィンドウにコマンドを入力し、完了したら、コマンドプロンプトに戻ります。通常、1〜2分程度で終了します。ただし、他のアプリケーション(geditなど)を起動した場合は、そのアプリケーションを閉じるまでターミナルウィンドウを使用することはできません。
しかし、アプリケーションをバックグラウンド・プロセスとして起動し、ターミナル・ウィンドウを使い続けることができます。そのためには、コマンドラインにwith記号を追加するだけです。
gedit command_address.page &Bashは起動したプロセスのプロセスIDを表示し、コマンドラインに戻ります。その後、ターミナルウィンドウを使用して続行できます。
Linuxの多くのコマンドは、引数としてファイルを受け取り、そのファイルからデータを取得します。これらのコマンドのほとんどは、ストリームから入力を受けることもできる。ストリームを作成するには、次の例のように、左カギカッコ(<)を使用して、ファイルをコマンドにリダイレクトします。
sort < words.txtコマンドが入力をリダイレクトする場合、名前付きファイルから読み込むときとは異なる動作をすることがあります。
wcを使ってファイルの単語、行、文字を数えると、その値が表示され、次にファイル名が表示されます。ファイルの内容をwcにリダイレクトすると、同じ値が表示されるが、データの元となったファイル名は表示されない。ファイル名は表示されません。
wcの使用例として、以下のようなものがあります。
wc words.txt wc < words.txtコマンドの出力は、右カギ括弧(>)を使ってファイルにリダイレクトすることができます。
ls > files.txt cat files.txt数字(この例では2)を>と一緒に使うと、出力リダイレクトはエラーメッセージ;もリダイレクトすることができる。その方法は次のとおりです。
wc doesntexist.txt 2> errors.txt cat errors.txt関連:Linuxのstdin, stdout, stderrとは何ですか?
パイプは、コマンド同士をつなぐものです。あるコマンドの出力を受け取り、それを次のコマンドの入力として提供します。パイプラインコマンドの数(鎖の長さ)は任意である。
ここでは、cat-feeding-text.txtファイルの内容をgrepに取り込み、小文字または大文字の「C」を含む行を抽出する。sortは-r(reverse)オプションを使って、ソート結果を逆順に表示する.
以下のように入力します。
cat words.txt | grep [cC] | sort -r感嘆符(!)は、そうでないことを示す論理演算子である。
このコマンドラインには、2つのコマンドがあります。
[ ! -d ./backup ] && mkdir ./backup最初のコマンドでは、!を論理演算子として使用します。d (ディレクトリ) オプションは,backup というディレクトリが存在するかどうかをテストします.2番目のコマンドは、ディレクトリを作成します。
ダブル・サインで2つのコマンドを区切っているので、Bashは最初のコマンドが成功した場合のみ、2番目のコマンドを実行します。しかし、これではまさに逆効果です。backup」ディレクトリのテストが成功すれば、そのディレクトリを作成する必要はありません。backup "ディレクトリに対するテストが失敗した場合、2番目のコマンドは実行されず、不足するディレクトリは作成されません。
そこに論理演算子があるのです!入ってください。論理的なノンゲートとして機能します。したがって、テストが成功した場合(つまり、ディレクトリが存在する場合)、!は "unsuccessful"、つまり失敗するように変換します。だから、2つ目のコマンドは発動しない。
ディレクトリテストが失敗した場合(ディレクトリが存在しない場合)、レスポンスは "no failure"、すなわち成功に変更されるので、不足分のディレクトリを作成するコマンドが実行される。
あのチビが! 必要な時に必要な力を発揮するんだ
バックアップフォルダの状態を確認するには、以下のようにlsコマンドと-l(long list)オプション、-d(directory)オプションを使用します。
ls -l -d backupまた、感嘆符を使ってコマンドヒストリーからコマンドを実行することもできます。 historyコマンドは、コマンドヒストリーを一覧表示し、再実行したいコマンドの番号を打ち込みます下図のとおりです。
!24次のコマンドを実行すると、前のコマンドが再実行されます。
!!bashshellでは、値を保持するための変数が作成されます。いくつかの変数(環境変数など)は常に存在し、ターミナルウィンドウを開けばいつでもアクセスできます。これらは、ユーザー名、ホームディレクトリ、パスなどの値を含んでいます。
echoを使うと、次のようにドル記号($)を前にした変数名の値を見ることができます。
echo $USER echo $HOME echo $PATH変数を作成するには、名前を付けて、保存する値を指定する必要があります。変数を作成する際にドル記号を使用する必要はありません。次の例のように、変数を参照するときだけ $ を追加します。
ThisDistro=Ubuntu MyNumber=2001 echo $ThisDistro echo $MyNumberドル記号の周りに中括弧({})を付けてパラメータ展開を行い、変数の値を取得し、さらにその値を変換できるようにします。
これにより、以下のように文字列を含む変数が作成されます。
MyString=123456qwerty以下のコマンドで、端末のウィンドウに文字列を表示し直します。
echo ${MyString}文字列全体の6番目の位置から始まる部分文字列を返すには、次のコマンドを使用します(オフセットは0なので、最初の位置は0です)。
echo ${myString:6}位置0から始まり、次の6文字を含む部分文字列を表示し直すには、次のコマンドを使用します。
echo ${myString:0:6}位置4から始まり、次の4文字を含む部分文字列を返すには、次のコマンドを使用します。
echo ${myString:4:4}特殊文字をテキスト文字(非特殊文字)として使用したい場合は、Bashシェルに伝える必要があります。これをクォートと呼び、3つの方法があります。
テキストを逆カンマ("...")で囲むと、Bashがほとんどの特殊文字に対して操作を行うことができなくなり、単に印刷されるだけになってしまいます。ただし、ドル記号($)は例外です。それでも変数式の文字として機能するため、出力に変数の値を含めることができます。
例えば、このコマンドは日付と時刻を表示します。
echo "Today is $(date)"以下のように一重引用符("...")で囲むと、すべての特殊文字の機能を停止します。
echo 'Today is $(date)'バックスラッシュ( \ )を使用すると、次の文字が特殊文字として使用されるのを防ぐことができます。これらは「エスケープ」文字と呼ばれ、次の例を参照してください。
echo "Today is \$(date)"特殊文字は、非常に短いコマンドだと考えてください。使い方を覚えておくと、bashshellや他の人のスクリプトを理解するのに非常に役立ちます。
関連:知っておきたいLinuxの重要コマンド37選