ホームページ php教程 PHP开发 シェル プログラミング: Bash スペースに関するもの

シェル プログラミング: Bash スペースに関するもの

Nov 23, 2016 pm 12:57 PM
shell

まず、bash でスペースを使用する場合と使用しない場合を理解します。

1. 等号の割り当ての両側にスペースを入れることはできません

2. コマンドとオプションの間にはスペースが必要です

3. パイプの両側のスペースはオプションです

よくある問題を見てみましょう

1. 値を割り当てるときの等号 両側または左側にのみ余分なスペースがあります
test@pythontab.com ~ $ var1 = test
bash: var1: command not found
test@pythontab.com ~ $ echo ${ var1:?error}
bash: var1: error
test @pythontab.com ~ $ echo ${var1?error}
bash: var1: error
test@pythontab.com ~ $ var2 =test
bash: var2: コマンドではありませんfound
test@pythontab.com ~ $ echo ${var2 :?error}
bash: var2: error
test@pythontab.com ~ $ echo ${var2?error}
bash: var2: error

ここでは bash を使用しました変数展開、${var1:?error} の場合 var1 が未設定または null (未定義または空) の場合は、指定されたエラーが報告されます。 ${var1?error} var1 が未設定の場合は、指定されたエラーが報告されます。実行結果から見て、等号の左側にスペースがある場合は変数名がコマンドとして実行され、結果はcommand not foundとなり、変数は代入されません。 , 等号の左側にはスペースがありませんが、右側にはスペースがあります (この状況は少し、特に 2 つの状況が見つかります)
test@pythontab.com ~ $ var= test
test@pythontab.com ~ $ var= nocmd
bash: nocmd: command not found

1 つのコマンドではエラーが報告されませんでしたが、2 番目のコマンドではエラーが報告されました。

これは、シェルでコマンドを実行する次のような方法があるためです: var=string command

コマンド command は変数 var の値を取得します (コマンド実行後に変数 var の値が保持されるかどうかについては)実行しても bash4 には保持されませんが、ダッシュで見つけたときは保持しておきました。test はコマンドであり nocmd ではないため、コマンドが見つからないことを報告しました。
test@pythontab.com ~ $ var=newtest eval echo $var
newtest
test@pythontab.com ~ $ echo $var

注: ここで eval を使用したのは、最初の解析中に $var が空の文字列に置き換えられるのを避けるためです。そうしないと、次の状況が発生します。 (以下は間違ったテスト方法です。echo実行前に$varが空の文字列に置き換えられています)

コードは以下の通りです:
test@pythontab.com ~ $ var=newtest echo $var
test@pythontab .com ~ $ echo $var

この時点で、等号の代入では左側と右側にスペースを入れることはできないことは誰もが理解していると思いますが、右側にスペースがあると必ずしもエラーが発生するわけではありません。あなたが望む結果。

3. コマンドとオプションの間にはスペースが必要です

これは誰もが理解しているようですが、なぜ私はまだこんなに冗長なのでしょうか?そういえば、非常に特別なコマンドについて触れなければなりません: [ コマンド (正しく読みます、[ ) です。これはテスト コマンドです (もちろん bash では、これは組み込みコマンドですが、影響はありません)私たちの理解はここにあります))。おそらく、[コマンドに見覚えがあると思われるでしょう。はい、見たことがあるはずです。次の例を見てください
test@pythontab.com ~ $ if [ "abc" = "abc" ];は同じです '; fi
それらは同じです
test@pythontab.com ~ $ type -a [
[はシェル組み込みです
[は/usr/bin/[

覚えていますか? [コマンドは if 判定でよく使用されます。もちろん、次のように記述することを好む人もいます
test@pythontab.com ~ $ [ "abc" = "cba" ] || 'それらは同じではありません' || 彼らは同じです同じではありません
test @pythontab.com ~ $ type -a [
[ はシェル組み込みです
[ は /usr/bin/[

[ このコマンドは test コマンドと呼ばれます。なぜ同じではないのですか。まったく同じ?これを見てみましょう
test@pythontab.com ~ $ [ "abc" = "cba"
bash: [: missing `]'
test@pythontab.com ~ $ [ "abc" = "cba" ]
test @pythontab .com ~ $test "abc" = "cba" ]
bash: test: 引数が多すぎます
test@pythontab.com ~ $test "abc" = "cba"

[コマンド,末尾を付ける必要があります]、test コマンドを使用する場合、末尾を追加することはできません。 Tail] は [コマンドの終わりを表す最後のパラメータであり、必須のパラメータです

ここまでお話してきましたが、これとスペースはどう関係するのでしょうか?皆さんに理解していただくために、最初にこれを言っておきます: [これはシェル内のコマンドであり、前後にスペースが必要です。 ] は [ の最後の必須パラメータであり、両側にスペースも必要です (ps など一部のコマンドのパラメータは接続できますが、[ コマンドは接続できません。パラメータ間にスペースが必要です)。 [よくある間違い

a. if と [
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'
bash: 構文を見てみましょう。予期しないトークン `then' 付近のエラー
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: 予期しないトークン ` then'
test 付近の構文エラー@pythontab.com ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: 予期しないトークン `then' 付近の構文エラー
test@pythontab.com ~ $ if[" $HOME" = "/home/igi" ];then echo 'equal'; fi
bash: 予期しないトークン `then' 付近で構文エラーが発生しました

明らかに、構文解析エラーです。 if[ bash の場合、それが一体何なのかわかりません

b. [ と次のパラメータの間にスペースがありません
test@pythontab.com ~ $ if ["$HOME " = "/ home/igi" ];then echo 'equal'; fi
bash: [/home/igi: そのようなファイルまたはディレクトリはありません
test@pythontab.com ~ $ if ["$HOME" = "/home/ igi"]; then echo 'equal'; fi
bash: [/home/igi: そのようなファイルやディレクトリはありません

["$HOME" bash については、一体何なのかわかりません

c. [ ] 間のパラメータ
test@pythontab.com ~ $ if [ "abc"="abc" ] then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "abc"=" cba" ] ; then echo 'equal'; fi
equal

最初のコマンドは正しいようです (実際には単なる偶然です)。2 番目のコマンドを見ると、「abc」と「cba」は明らかに異なりますが、それらは異なります。同一であると判断されます。これは、パラメータ間にスペースが不足しており、[コマンドは内部値を単なる値とみなしているためです。次のコマンドを見てください。安心します
test@pythontab.com ~ $ if [ 0 ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "1" ]; echo ' 等しい'; fi
equal
test@pythontab.com ~ $ if [ "" ]; then echo 'equal'; in [ ] 内部的には、空の文字列ではない値が 1 つだけある場合 (欠落したスペースで連結された値もカウントされます)、true になります。したがって、[ ] の間のパラメータも両側にスペースが必要であり、積み重ねることはできません

d パラメータとテールの間にスペースがありません

これは冗長ではありません、テール] も [ のパラメータです。前述したように、パラメーターの間にはスペースが必要です

[コマンドとスペース] についてはここまでですが、もちろん、これは運が良ければ正しく実行できる場合もありますので、見てみましょう
。 @pythontab.com ~ $ var='abc'
test@pythontab.com ~ $ if [$var = "abc" ];then echo 'equal'; fi
equal
test@pythontab.com ~ $ if ["$ var" = "abc" ];then echo 'equal'; fi
bash: [ abc: command not found

全体を二重引用符で囲み、二重引用符がない場合は前後のスペースまたはタブ弦はカットされています。文字列の前後のスペースやタブを偶然見つけた場合、または意図的に破棄したい場合は、不可能ではありませんが、これを記述することは強くお勧めできません。コードは非常に脆弱になります。

または、追加する必要があるスペースをすべて追加したにもかかわらず、エラーが発生する場合もあります。これは、二重引用符の欠如に関連している可能性があります。この状況は非常に一般的です。最後に見てみましょう
test@pythontab.com ~ $ var=''
test@pythontab.com ~ $ if [ "$var" = "abc" ]; then echo 'equal' ; fi
test@pythontab.com ~ $ if [ $var = "abc" ]; then echo 'equal'; fi
bash: [: =: 単項演算子が期待されます
test@pythontab.com ~ $ dvar='a b c '
test @pythontab.com ~ $ if [ $dvar = "ab c" ];then echo 'equal'; fi
bash: [: 引数が多すぎます
test@pythontab.com ~ $ if [ "$dvar" = " a b c" ] ;then echo 'equal'; fi
equal

また冗長になりますが、二重引用符を安易に省略しないでください。明らかですか?それでも理解できない場合は、

最後に、パイプの両側のオプションのスペースについてはくだらない話はしません。これについて疑問を持っている人に会ったことがないからです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 にクラシック シェルをインストールするにはどうすればよいですか? Windows 11 にクラシック シェルをインストールするにはどうすればよいですか? Apr 21, 2023 pm 09:13 PM

<p>オペレーティング システムをカスタマイズすることは、日常生活をより楽しくするための素晴らしい方法です。ユーザー インターフェイスの変更、カスタム テーマの適用、ウィジェットの追加などを行うことができます。そこで今日は、Windows 11にClassicShellをインストールする方法を説明します。 </p><p>このプログラムは長い間存在しており、オペレーティング システムを変更することができます。 2017年に解散したこの組織は現在、ボランティアによって運営され始めている。新しいプロジェクトは OpenShell と呼ばれ、興味のある人は現在 Github で入手できます。 </p>&a

HRESULT 0x80073D02 問題が修正され、PowerShell のデプロイメントが失敗する HRESULT 0x80073D02 問題が修正され、PowerShell のデプロイメントが失敗する May 10, 2023 am 11:02 AM

スクリプトを実行すると、PowerShell で「Add-AppxPackage: Deployment failed with HRESULT: 0x80073D02, The package can be install because the resource itmodifying is currently in use. Error 0x80073D02...」というエラー メッセージが PowerShell に表示されますか?エラー メッセージに記載されているように、これは、前のプロセスの実行中にユーザーが 1 つまたはすべての WindowsShellExperienceHost アプリケーションを再登録しようとすると発生します。この問題を迅速に解決するための簡単な解決策がいくつかあります。解決策 1 – powershell コマンドを実行する前に終了する必要があるエクスペリエンス ホスト プロセスを終了します。

Open Shell Windows 11が動作しない問題の修正は次のとおりです。 Open Shell Windows 11が動作しない問題の修正は次のとおりです。 Apr 14, 2023 pm 02:07 PM

Windows 11 でオープン シェルが実行されないことは新しい問題ではなく、この新しいオペレーティング システムの登場以来ユーザーを悩ませています。 Open-Shell Windows 11 が動作しない問題の原因は特定されていません。プログラム内の予期しないエラー、ウイルスやマルウェアの存在、システム ファイルの破損などが原因で発生する可能性があります。知らない人のために説明すると、Open-Shell は 2017 年に廃止された Classic Shell の後継です。 Windows 11 に Classic Shell をインストールする方法に関するチュートリアルをご覧ください。 Windows 11のスタートメニューを置き換える方法

システム起動時に Explorer.exe が起動しない [修正] システム起動時に Explorer.exe が起動しない [修正] Jun 03, 2023 am 08:31 AM

最近、多くの Windows ユーザーが Windows システムの重大な問題に遭遇し始めています。問題は、システムのロード後に Explorer.exe が起動できず、ユーザーがファイルやフォルダーを開けないことです。ただし、Windows ユーザーは場合によってはコマンド プロンプトを使用して Windows エクスプローラーを手動で開くことができますが、これはシステムを再起動するたびに、またはシステム起動後に実行する必要があります。これは問題となる可能性があり、以下に説明する要因が原因です。システムファイルが破損しています。高速スタートアップ設定を有効にします。ディスプレイドライバーが古いか問題があります。システム内の一部のサービスに変更が加えられました。変更されたレジストリ ファイル。上記のすべての要素を念頭に置いて、ユーザーに確実に役立ついくつかの要素を考え出しました。

Linux でファイルの末尾の行をすばやく削除する方法 Linux でファイルの末尾の行をすばやく削除する方法 Mar 01, 2024 pm 09:36 PM

Linux システムでファイルを処理する場合、ファイルの末尾の行を削除する必要がある場合があります。この操作は実際のアプリケーションでは非常に一般的で、いくつかの簡単なコマンドで実行できます。この記事では、Linux システムでファイルの末尾の行をすばやく削除する手順と、具体的なコード例を紹介します。ステップ 1: ファイルの最終行を確認する 削除操作を実行する前に、最初にファイルの最終行がどの行であるかを確認する必要があります。ファイルの最後の行を表示するには、tail コマンドを使用できます。具体的なコマンドは次のとおりです: tail-n1filena

Windows でシェル スクリプト ファイルを実行するさまざまな方法 Windows でシェル スクリプト ファイルを実行するさまざまな方法 Apr 13, 2023 am 11:58 AM

Linux 用 Windows サブシステム 最初のオプションは、Linux バイナリ実行可能ファイルを Windows システム上でネイティブに実行するための互換性レイヤーである Windows サブシステム for Linux または WSL を使用することです。ほとんどのシナリオで機能し、Windows 11/10 でシェル スクリプトを実行できるようになります。 WSL は自動的には利用できないため、Windows デバイスの開発者設定を通じて有効にする必要があります。これを行うには、[設定] > [更新とセキュリティ] > [開発者向け] に移動します。開発者モードに切り替え、プロンプトを確認して [はい] を選択します。次にWを探します

超ハードコア!非常に実用的な Python とシェル スクリプトの例 11 個! 超ハードコア!非常に実用的な Python とシェル スクリプトの例 11 個! Apr 12, 2023 pm 01:52 PM

Python スクリプトの例: エンタープライズ WeChat アラーム、FTP クライアント、SSH クライアント、Saltstack クライアント、vCenter クライアント、ドメイン名 SSL 証明書の有効期限の取得、今日の天気予報と将来の天気傾向グラフの送信、シェル スクリプトの例: SVN フル バックアップ、 Zabbixによるユーザーパスワードの有効期限の監視、ローカルYUMの構築、前回の記事の読者ニーズ(負荷が高い場合、占有率の高い処理スクリプトを見つけて通知を保存またはプッシュ通知する)については、少し長いので読んでください。記事の最後には、やはりイースターエッグがあります。エンタープライズ WeChat アラームの Python スクリプト部分 このスクリプトはエンタープライズ WeChat アプリケーションを使用して WeChat アラームを実行し、使用できます

Open Shell をインストールして Windows 11 で従来のスタート メニューを復元する方法 Open Shell をインストールして Windows 11 で従来のスタート メニューを復元する方法 Apr 18, 2023 pm 10:10 PM

OpenShell は、Windows 11 の [スタート] メニューをカスタマイズして、クラシック スタイルのメニューまたは Windows 7 スタイルのメニューに似せるために使用できる無料ソフトウェア ユーティリティです。以前のバージョンの Windows の [スタート] メニューは、システムのコンテンツを参照する簡単な方法をユーザーに提供しました。基本的に、OpenShell は ClassicShell の代替品であり、以前の Windows バージョンから後者のバージョンの機能を取得するのに役立つさまざまなユーザー インターフェイス要素を提供します。 ClassicShell は 2017 年に開発が中止されると、GitHub ボランティアによって OpenShell という名前で維持および開発されました。ウィン関連です

See all articles