Bash チュートリアル
Bashの使い方
サーチ…
バージョン
| バージョン | 発売日 |
|---|---|
| 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 |
変数を使用する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シェルの変数を引用するのを忘れるというセキュリティの意味を読んでください。
こんにちは世界
インタラクティブシェル
Bashシェルは一般的に対話的に使用されます。コマンドを入力して編集し、 Returnキーを押したときに実行します。多くのUnixベースのオペレーティングシステムやUnixライクなオペレーティングシステムでは、Bashをデフォルトシェル(LinuxやmacOSなど)として使用しています。端末は、起動時に対話型のBashシェルプロセスに自動的に入ります。
Hello World出力するには、次のように入力します。
echo "Hello World"
#> Hello World # Output Example
ノート
ターミナルにシェルの名前を入力するだけで、シェルを変更することができます。例:
sh、bashなどechoは受け取った引数を標準出力に書き出すBash組み込みコマンドです。デフォルトでは、出力に改行が追加されます。
非インタラクティブシェル
Bashシェルは、スクリプトから非対話的に実行することもでき、シェルは人間とのやりとりを必要としません。対話型の動作とスクリプト化された動作は同一でなければなりません。これはUnix V7 Bourneシェルの重要な設計上の考慮事項であり、一時的なBashです。したがって、コマンドラインで実行できるものは、スクリプトファイルに入れて再利用することができます。
Hello Worldスクリプトを作成するには、次の手順に従います。
hello-world.shというhello-world.sh新しいファイルを作成するtouch hello-world.shchmod+x hello-world.sh実行してスクリプトを実行可能にします。このコードを追加:
#!/bin/bash echo "Hello World"行1 :スクリプトの最初の行は、文字シーケンス
#!始まる必要があります#!、 シバン 1と呼ばれる。 shebangはオペレーティングシステムに/bin/bash(Bashシェル)を実行し、スクリプトのパスに引数を渡します。例:
/bin/bash hello-world.sh2行目 :
echoコマンドを使用してHello Worldを標準出力に書き出します。
次のいずれかを使用して、コマンドラインから
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内のディレクトリに移動して、 catやlsようなシステムコマンドのように、現在の作業ディレクトリ。
一般的な間違いは次のとおりです。
chmod +x hello-world.shの出力をもたらすファイル、すなわちchmod +x hello-world.sh実行許可を忘れると、./hello-world.sh: Permission denied。Windows上でスクリプトを編集すると、Bashが処理できない不正な行末文字が生成されます。
一般的な症状は
: command not foundです: command not found。キャリッジリターンによってカーソルが行の先頭に移動し、エラーメッセージのコロンの前にテキストが上書きされます。スクリプトは
dos2unixプログラムを使用して修正できます。使用例:
dos2unix hello-world.shdos2unixはファイルをインラインで編集します。sh ./hello-world.shを使用して、bashとshが異なる機能を持つ別個のシェルであることを認識しません(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とも呼ばれます。
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
ユーザー入力を伴う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.
ここで、ユーザがアクションを入力すると、そのアクションに「印刷中」が付加されます。
名前付き引数の処理
#!/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
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=
文字列のクォートの重要性
クォートは、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
初心者の詳細以外の詳細については、 ここで引き続き読むことができます 。