Unixシェルが世界をどのように見ているか(拡大,引用)
9231 ワード
TLドクター
Unix端末を使っていて、端末コマンドの100行を入力していたのですが、時々コマンドの後にEnterボタンを押すと、予期しない動作に遭遇します.それはいくつかの点でかなり挫折しています、シェルが世界を見る方法が私のものと異なる方法がわかる.私は、シェルがコマンドにどのように作用するかについていくつかの本(少なくともいくつかの章)を読みました.この役に立つ.
これはとても簡単です.エコーコマンドだけで、我々はいくつかの興味深い特徴を調べることができます
拡大
たびに我々はコマンドの後にEnterキーを押すと、それを実行する前にフードの下にシェルによって変換取得します.それが起こるプロセスは呼び出し拡張です.拡張は、何かを入力するとき、シェルがそれに作用する前に別のものに拡張されることです.例えば:*はシェルに多くを意味します.これを説明するために、echoは単純なシェル組み込み関数で、私たちの入力を標準出力に指示します
phuong@Arch ~$ echo Hello world
Hello world
したがって、ワイルドカードの意味:ファイル名の任意の文字に一致します.echoコマンドがシェルによって実行される前に* getが他の文字に変換されるという事実
phuong@Arch ~/kitchen$ echo *
bash device devops gateway go hook iuh js linux ml python
ファイル名拡張
実際には、この動作は、パス名展開と呼ばれるメカニズムによって行われます.私たちが知っているように、ファイル名はピリオド文字(Ex :. git)で始まります.パス名拡張子はこの規則を尊重します.展開は隠しファイルを明らかにしません.
phuong@Arch ~$ echo D*
Desktop Documents Downloads
しかし、以下のコマンドですべての隠しファイルを表示できます.
phuong@Arch ~$ echo .*
. .. .3T .ansible .anydesk .bash_history .bash_logout .bash_profile .bashrc .bashrc.backup .boto .cache .config .dbshell .designer .docker
算術拡張
また、算術演算のおかげで端末コマンドを使用することもできますが、これは単純な整数で動作します.その制限にもかかわらず、いくつかのシナリオで役に立つかもしれません、それはまた、多くの一般的な演算子をサポートします.と言いましょう.
算術展開は以下のパターンに従います:
$(式)
phuong@Arch ~$ echo This month has $((4*7)) days
This month has 28 days
二重括弧の代替として、単一の括弧を使用してサブ展開をネストすることもできます.例えば
phuong@Arch ~$ echo This year has $((((4*7)*12) + $((3 * 9)))) days
This year has 363 days
チルダ展開
端末内の文字列の先頭として~を使用すると、名前付きユーザーのホームディレクトリに展開されます.
例えば、私は多くのユーザーがいるクラウド上でアカウントを使用しています、そして、私は彼らのホームディレクトリがどこにあるか知られていません.それはそれが遊びに来るところです
phuong@devcloud1:~$ echo ~wingzero
/home/wingzero
phuong@devcloud1:~$ echo ~phuong
/home/phuong
ブレス拡大
ブレース式自体は文字列のコンマ区切りのリストまたは整数の範囲または単一の文字を含むことができます.
コンマ区切りの例については、
phuong@Arch ~/kitchen/ips$ echo A{A,B}
AA AB
同様に、1文字の範囲
phuong@Arch ~$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
私の観点から、この種の拡大は特定の状況でかなり役に立つので、最も面白い拡大メカニズムのうちの1つです.私はサブネット範囲内の各ネットワークIPの各フォルダを作成したいと仮定します.192.168.43.1 -> 192.168.43.13を見せかけるそれで、私は4ヵ月の試みをする方法を告白します.しかし、このアプローチはtypoエラーになりやすい.そのため、ブレース展開が来て保存されます.
phuong@Arch ~/kitchen/ips$ mkdir 192.168.43.{1..13}
phuong@Arch ~/kitchen/ips$ ls
192.168.43.1 192.168.43.12 192.168.43.3 192.168.43.6 192.168.43.9
192.168.43.10 192.168.43.13 192.168.43.4 192.168.43.7
192.168.43.11 192.168.43.2 192.168.43.5 192.168.43.8
ブレース展開も入れ子にできます.
phuong@Arch ~/kitchen/ips$ echo A{a{1,2},b{9,10}}
Aa1 Aa2 Ab9 Ab10
コマンド置換
上記の拡張メカニズムの他に、コマンド置換は、スクリプトで広く使用されるので、あなたがよく知っているかもしれないと感じるかもしれません.コマンド置換はコマンドの出力を展開として使用することができます.例えば:
phuong@Arch ~/kitchen$ ls -l $(which go)
lrwxrwxrwx 1 root root 18 Nov 2 17:25 /usr/bin/go -> /usr/lib/go/bin/go
もう一つの例
phuong@Arch ~$ echo Hello $(w=world; echo $w)
Hello world
パラメータ置換
この種の置換は、直接コマンドラインよりスクリプトで使用されます.簡単な例では、ユーザー変数を印刷したい場合は、先頭にドル記号($)を追加します.
phuong@Arch ~$ echo $USER
phuong
変数の名前を間違えた場合、拡張はまだ行われますが、空の文字列になります.
単純さのために、私は詳細には行きません.この強力なメカニズムがそれのためのもう一つのポストに値するので.このポストの範囲は、いくつかの人気の拡張メカニズムとそれらを制御する方法を指摘することです.
引用
それで、シェルの拡大がどれくらい強力かについて見ました.
現在、我々は面白い部分に来ます.
以下の2つのサンプルを考えます.
例1 :
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
例2 :
phuong@Arch ~$ echo It costs me $200
It costs me 00
おなじみのああ感じ?
最初の例では、単語の分割は、エコーコマンドの引数リストから余分な空白を取り出します.2番目の例では、$ 2はパラメータ展開機構によって展開されています.これは目的変数です.これをどう修正するかを調べましょう.
ダブル引用
二重引用符に特殊文字を置くとシェルに特別な意味が失われますが、3つの例外があります.つまり、ドル記号、バックスラッシュ、バックティックです.
これは指定されたシナリオでかなり役に立ちます.私が意味するものを示すために、あなたの友人の1人があなたに「宿題1 . doc」という名前の宿題ファイルを送ると想像してください.さて、それはあなたを夢中にさせるかもしれません.
それはあなたの状況以下につながる
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
ダブル引用符はあなたを救うために来る.
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
二重引用符が追加されると、コマンドには1つの引数が続きます.つまり、我々の余分なホワイトスペースを保存する方法です.なぜなら、上記の世界分割は複数のパラメータに対してのみ効果があるからです.すべてをダブル引用符で入力すると、それはエコーコマンド
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
シングル引用
単にすべての特殊文字を抑制する必要がある場合は
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
エスケープ文字
時々私たちは単一の文字だけを引用したいです、これをするために、その文字の前にバックスラッシュ
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
ファイル名の拡張を選択的に防ぐのが一般的です.
結論
要約すると、Unixシェルの拡張メカニズムは大きくて強力です.我々がそれをコントロールする方法を知っているならば、私はそれらの機能が確実にあなたの生産性を強化すると思っています.質問がある場合は、以下のコメントをドロップすること自由に感じ、それはあなたから聞いていいです.
あなたの時間をありがとう.
参考文献
たびに我々はコマンドの後にEnterキーを押すと、それを実行する前にフードの下にシェルによって変換取得します.それが起こるプロセスは呼び出し拡張です.拡張は、何かを入力するとき、シェルがそれに作用する前に別のものに拡張されることです.例えば:*はシェルに多くを意味します.これを説明するために、echoは単純なシェル組み込み関数で、私たちの入力を標準出力に指示します
phuong@Arch ~$ echo Hello world
Hello world
したがって、ワイルドカードの意味:ファイル名の任意の文字に一致します.echoコマンドがシェルによって実行される前に* getが他の文字に変換されるという事実phuong@Arch ~/kitchen$ echo *
bash device devops gateway go hook iuh js linux ml python
ファイル名拡張
実際には、この動作は、パス名展開と呼ばれるメカニズムによって行われます.私たちが知っているように、ファイル名はピリオド文字(Ex :. git)で始まります.パス名拡張子はこの規則を尊重します.展開は隠しファイルを明らかにしません.
phuong@Arch ~$ echo D*
Desktop Documents Downloads
しかし、以下のコマンドですべての隠しファイルを表示できます.phuong@Arch ~$ echo .*
. .. .3T .ansible .anydesk .bash_history .bash_logout .bash_profile .bashrc .bashrc.backup .boto .cache .config .dbshell .designer .docker
算術拡張
また、算術演算のおかげで端末コマンドを使用することもできますが、これは単純な整数で動作します.その制限にもかかわらず、いくつかのシナリオで役に立つかもしれません、それはまた、多くの一般的な演算子をサポートします.と言いましょう.
算術展開は以下のパターンに従います:
$(式)
phuong@Arch ~$ echo This month has $((4*7)) days
This month has 28 days
二重括弧の代替として、単一の括弧を使用してサブ展開をネストすることもできます.例えばphuong@Arch ~$ echo This year has $((((4*7)*12) + $((3 * 9)))) days
This year has 363 days
チルダ展開
端末内の文字列の先頭として~を使用すると、名前付きユーザーのホームディレクトリに展開されます.
例えば、私は多くのユーザーがいるクラウド上でアカウントを使用しています、そして、私は彼らのホームディレクトリがどこにあるか知られていません.それはそれが遊びに来るところです
phuong@devcloud1:~$ echo ~wingzero
/home/wingzero
phuong@devcloud1:~$ echo ~phuong
/home/phuong
ブレス拡大
ブレース式自体は文字列のコンマ区切りのリストまたは整数の範囲または単一の文字を含むことができます.
コンマ区切りの例については、
phuong@Arch ~/kitchen/ips$ echo A{A,B}
AA AB
同様に、1文字の範囲phuong@Arch ~$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
私の観点から、この種の拡大は特定の状況でかなり役に立つので、最も面白い拡大メカニズムのうちの1つです.私はサブネット範囲内の各ネットワークIPの各フォルダを作成したいと仮定します.192.168.43.1 -> 192.168.43.13を見せかけるそれで、私は4ヵ月の試みをする方法を告白します.しかし、このアプローチはtypoエラーになりやすい.そのため、ブレース展開が来て保存されます.phuong@Arch ~/kitchen/ips$ mkdir 192.168.43.{1..13}
phuong@Arch ~/kitchen/ips$ ls
192.168.43.1 192.168.43.12 192.168.43.3 192.168.43.6 192.168.43.9
192.168.43.10 192.168.43.13 192.168.43.4 192.168.43.7
192.168.43.11 192.168.43.2 192.168.43.5 192.168.43.8
ブレース展開も入れ子にできます.phuong@Arch ~/kitchen/ips$ echo A{a{1,2},b{9,10}}
Aa1 Aa2 Ab9 Ab10
コマンド置換
上記の拡張メカニズムの他に、コマンド置換は、スクリプトで広く使用されるので、あなたがよく知っているかもしれないと感じるかもしれません.コマンド置換はコマンドの出力を展開として使用することができます.例えば:
phuong@Arch ~/kitchen$ ls -l $(which go)
lrwxrwxrwx 1 root root 18 Nov 2 17:25 /usr/bin/go -> /usr/lib/go/bin/go
もう一つの例phuong@Arch ~$ echo Hello $(w=world; echo $w)
Hello world
パラメータ置換
この種の置換は、直接コマンドラインよりスクリプトで使用されます.簡単な例では、ユーザー変数を印刷したい場合は、先頭にドル記号($)を追加します.
phuong@Arch ~$ echo $USER
phuong
変数の名前を間違えた場合、拡張はまだ行われますが、空の文字列になります.単純さのために、私は詳細には行きません.この強力なメカニズムがそれのためのもう一つのポストに値するので.このポストの範囲は、いくつかの人気の拡張メカニズムとそれらを制御する方法を指摘することです.
引用
それで、シェルの拡大がどれくらい強力かについて見ました.
現在、我々は面白い部分に来ます.
以下の2つのサンプルを考えます.
例1 :
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
例2 :
phuong@Arch ~$ echo It costs me $200
It costs me 00
おなじみのああ感じ?
最初の例では、単語の分割は、エコーコマンドの引数リストから余分な空白を取り出します.2番目の例では、$ 2はパラメータ展開機構によって展開されています.これは目的変数です.これをどう修正するかを調べましょう.
ダブル引用
二重引用符に特殊文字を置くとシェルに特別な意味が失われますが、3つの例外があります.つまり、ドル記号、バックスラッシュ、バックティックです.
これは指定されたシナリオでかなり役に立ちます.私が意味するものを示すために、あなたの友人の1人があなたに「宿題1 . doc」という名前の宿題ファイルを送ると想像してください.さて、それはあなたを夢中にさせるかもしれません.
それはあなたの状況以下につながる
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
ダブル引用符はあなたを救うために来る.
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
二重引用符が追加されると、コマンドには1つの引数が続きます.つまり、我々の余分なホワイトスペースを保存する方法です.なぜなら、上記の世界分割は複数のパラメータに対してのみ効果があるからです.すべてをダブル引用符で入力すると、それはエコーコマンド
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
シングル引用
単にすべての特殊文字を抑制する必要がある場合は
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
エスケープ文字
時々私たちは単一の文字だけを引用したいです、これをするために、その文字の前にバックスラッシュ
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
ファイル名の拡張を選択的に防ぐのが一般的です.
結論
要約すると、Unixシェルの拡張メカニズムは大きくて強力です.我々がそれをコントロールする方法を知っているならば、私はそれらの機能が確実にあなたの生産性を強化すると思っています.質問がある場合は、以下のコメントをドロップすること自由に感じ、それはあなたから聞いていいです.
あなたの時間をありがとう.
参考文献
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
phuong@Arch ~$ echo It costs me $200
It costs me 00
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
要約すると、Unixシェルの拡張メカニズムは大きくて強力です.我々がそれをコントロールする方法を知っているならば、私はそれらの機能が確実にあなたの生産性を強化すると思っています.質問がある場合は、以下のコメントをドロップすること自由に感じ、それはあなたから聞いていいです.
あなたの時間をありがとう.
参考文献
Reference
この問題について(Unixシェルが世界をどのように見ているか(拡大,引用)), 我々は、より多くの情報をここで見つけました https://dev.to/phuonghau98/how-the-unix-shell-sees-the-world-expansion-quoting-42ngテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol