Looking for bash Answers? Try Ask4KnowledgeBase
Looking for bash Keywords? Try Ask4Keywords

BashBashの使い方


バージョン

バージョン発売日
0.99 1989-06-08
1.01 1989-06-23
2.0 1996-12-31
2.02 1998年04月20日
2.03 1999-02-19
2.04 2001年3月21日
2.05b 2002年7月17日
3.0 2004-08-03
3.1 2005-12-08
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014-02-26
4.4 2016-09-15

名前付き引数の処理

#!/bin/bash

deploy=false
uglify=false

while (( $# > 1 )); do case $1 in
   --deploy) deploy="$2";;
   --uglify) uglify="$2";;
   *) break;
 esac; shift 2
done

$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"

# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
 

こんにちは世界

インタラクティブシェル

Bashシェルは一般的に対話的に使用されます。コマンドを入力して編集し、 Returnキーを押したときに実行します。多くのUnixベースのオペレーティングシステムやUnixライクなオペレーティングシステムでは、Bashをデフォルトシェル(LinuxやmacOSなど)として使用しています。端末は、起動時に対話型のBashシェルプロセスに自動的に入ります。

Hello World 出力するには、次のように入力します。

echo "Hello World"
#> Hello World  # Output Example
 

ノート

  • ターミナルにシェルの名前を入力するだけで、シェルを変更することができます。例: shbash など

  • echo は受け取った引数を標準出力に書き出すBash組み込みコマンドです。デフォルトでは、出力に改行が追加されます。


非インタラクティブシェル

Bashシェルは、スクリプトから非対話的に実行することもでき、シェルは人間とのやりとりを必要としません。対話型の動作とスクリプト化された動作は同一でなければなりません。これはUnix V7 Bourneシェルの重要な設計上の考慮事項であり、一時的なBashです。したがって、コマンドラインで実行できるものは、スクリプトファイルに入れて再利用することができます。

Hello World スクリプトを作成するには、次の手順に従います。

  1. hello-world.sh というhello-world.sh 新しいファイルを作成する

    touch hello-world.sh
     
  2. chmod +x hello-world.sh 実行してスクリプトを実行可能にします。

  3. このコードを追加:

    #!/bin/bash
    echo "Hello World"
     

    行1 :スクリプトの最初の行は、文字シーケンス#! 始まる必要があります#!シバン 1と呼ばれる。 shebangはオペレーティングシステムに/bin/bash (Bashシェル)を実行し、スクリプトのパスに引数を渡します。

    例: /bin/bash hello-world.sh

    2行目echo コマンドを使用してHello World を標準出力に書き出します。

  1. 次のいずれかを使用して、コマンドラインからhello-world.sh スクリプトを実行します。

    • ./hello-world.sh - 最も一般的に使用され、推奨されています。
    • /bin/bash hello-world.sh
    • bash hello-world.sh - あなたの$PATH /bin があると仮定します
    • sh hello-world.sh

実際のプロダクションでは、 .sh 拡張子を省略することになります(これはBashスクリプトであり、 sh スクリプトではないので誤解を招く恐れがあります)。おそらくファイルをPATH 内のディレクトリに移動して、 catls ようなシステムコマンドのように、現在の作業ディレクトリ。

一般的な間違いは次のとおりです。

  1. chmod +x hello-world.sh の出力をもたらすファイル、すなわちchmod +x hello-world.sh 実行許可を忘れると、 ./hello-world.sh: Permission denied

  2. Windows上でスクリプトを編集すると、Bashが処理できない不正な行末文字が生成されます。

    一般的な症状は: command not found です: command not found 。キャリッジリターンによってカーソルが行の先頭に移動し、エラーメッセージのコロンの前にテキストが上書きされます。

    スクリプトはdos2unix プログラムを使用して修正できます。

    使用例: dos2unix hello-world.sh

    dos2unix はファイルをインラインで編集します。

  3. sh ./hello-world.sh を使用して、 bashsh が異なる機能を持つ別個のシェルであることを認識しません(Bashは下位互換性がありますが、反対の間違いは無害です)。

    とにかく、単にスクリプトのシバン行に頼るだけで、各スクリプトのファイル名の前にbash またはsh (またはpython またはperl またはawk またはruby または...)を明示的に記述することよりもはるかに優れています。

    スクリプトを移植性を高めるために使用する一般的なシバン行は、Bashへのパスをハードコードする代わりに#!/usr/bin/env bash を使用すること#!/usr/bin/env bash 。そうすれば、 /usr/bin/env が存在しなければなりませんが、その点を越えて、 bash はあなたのPATH 上になければなりません。多くのシステムでは、 /bin/bash は存在しないので、 /usr/local/bin/bash などの絶対パスを使用する必要があります。この変更により、その詳細を把握する必要がなくなります。


1 sha-bang、hashbang、pound-bang、hash-plingとも呼ばれます。

Hello Worldの「デバッグ」モード

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World
 

-x 引数を使用すると、スクリプト内の各行を処理できます。 1つの良い例がここにあります:

$ cat hello.sh
#!/bin/bash 
echo "Hello World\n" 
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number) 

$ ./hello.sh 
Hello World

expr: non-integer argument
 

上記のプロンプトのエラーは、スクリプトをトレースするには不十分です。ただし、次の方法を使用すると、スクリプト内のエラーを探す場所がわかりやすくなります。

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
 

変数を使用するHello World

次の内容のhello.sh という新しいファイルを作成し、 chmod +x hello.sh で実行可能なアクセス権を与えます。

実行/実行: ./hello.sh

#!/usr/bin/env bash

# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"

# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
 

これは実行時にHello, World を標準出力に出力します。

スクリプトがどこにあるかをbashに伝えるためには、それがあなたの作業ディレクトリであるならば./ つけて、通常は含んでいるディレクトリを指す. 現在のディレクトリのエイリアスです。ディレクトリを指定しないと、 bash$PATH 環境変数に含まれているディレクトリの1つでスクリプトの検索を試みます。


次のコードでは、最初のコマンドライン引数$1 受け取り、 Hello, 後に書式設定された文字列で出力します。

via実行/実行: ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
 

$1 は一重引用符ではなく二重引用符で引用する必要があることに注意することが重要です。 "$1" ながら、必要に応じて、最初のコマンドライン引数に展開'$1' リテラル文字列に評価される$1

セキュリティ上の注意:
可変テキストを二重引用符で囲むことの重要性を理解するために、 bashシェルの変数を引用するのを忘れるというセキュリティの意味を読んでください。

ユーザー入力を伴うHello World

以下は、ユーザーに入力を促し、その入力を文字列(テキスト)として変数に格納します。次に、変数を使用してユーザーにメッセージを送信します。

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."
 

ここでread れたコマンドread 、標準入力から1行のデータを変数name 読み込みます。これは$name を使って参照され、 echo を使って標準出力に出力されます。

出力例:

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
 

ここでユーザーは「Matt」という名前を入力しました。このコードはHello, Matt. と言いましたHello, Matt.

また、変数値に何かを追加する場合は、次の例に示すように、変数名の前後に中括弧を使用します。

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."
 

出力例:

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
 

ここで、ユーザがアクションを入力すると、そのアクションに「印刷中」が付加されます。

文字列のクォートの重要性

クォートは、bashの文字列展開では重要です。これらを使用すると、bashが文字列を解析して展開する方法を制御できます。

クォーテーションには2つのタイプがあります。

  • Weak二重引用符を使用する: "
  • Strong一重引用符を使用します: '

あなたの議論を拡張するためにbashしたい場合は、 弱い引用を使うことができます:

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
 

引数を拡張するためにbashしたくない場合は、 Strong Quotingを使うことができます:

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
 

拡張を防ぐためにエスケープを使うこともできます:

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
 

初心者の詳細以外の詳細については、 ここで引き続き読むことができます

Bashビルトインの情報の表示

help <command>
 

これにより、指定した組み込みのBashヘルプ(マニュアル)ページが表示されます。

たとえば、 help unset すると次のように表示されます。

unset: unset [-f] [-v] [-n] [name ...]
   Unset values and attributes of shell variables and functions.

   For each NAME, remove the corresponding variable or function.

   Options:
     -f    treat each NAME as a shell function
     -v    treat each NAME as a shell variable
     -n    treat each NAME as a name reference and unset the variable itself
       rather than the variable it references

   Without options, unset first tries to unset a variable, and if that fails,
   tries to unset a function.

   Some variables cannot be unset; also see `readonly'.

   Exit Status:
   Returns success unless an invalid option is given or a NAME is read-only.
 

短い説明付きのすべてのビルトインの一覧を表示するには、

help -d