讃岐小僧のEngineering×Techメモ

未経験から挑戦中のプログラミングや、趣味の野球や狩猟について、その他、ビジネスやテクノロジーをテーマに様々なことをつぶやく場所です。

【Linuxの標準教科書9章】引用符およびエスケープについて

はじめに

本記事も前回の記事シェルスクリプトについて part3に続きLinux標準教科書の内容をメモしていきます。

シェルスクリプトの引用符

これはものすごく単純だ。 Linuxの標準教科書の例の通りに説明すると

シングルクォーテーションの例

$ ABC=123
$ echo 'Value of ABC is $ABC.'

> Value of ABC is $ABC.

シングルクォーテーションで変数を含む文字列を囲っても変数の展開はされず$ABCがそのまま出力されてしまっています。

ダブルクォーテーションの例

では先ほどのecho文をダブルクォーテーションで囲ってみます。

$ echo "Value of ABC is $ABC."

> Value of ABC is 123.

今回は$ABCが展開されて123が表示されています。

バッククォーテーションの例

次にdateコマンドの戻り値をXYZに格納してみます。

$ XYZ=`date`  
$ echo "It is $XYZ now."

> It is Thu Mar 20 06:08:14 JST 2017 now

上記の例でも問題なく出力できますが、これは一度変数に代入するため少し手間がかかります。
バッククォーテーションを利用すれば、代入する変数に値を代入する手間を削減できます。

$ echo "It is `date` now."

> It is Thu Mar 20 06:08:14 JST 2017 now

ダブルクォーテーションの中で、dateコマンドをバッククォーテーションで囲ってあげることでそのまま呼び出し、および展開ができるます。便利ですね。

シェルの引数

下記のようなargs.shを作成します。

#!/bin/bash
echo '$1:' $1;
echo '$2:' $2;
echo '$3:' $3;
echo '$0:' $0;
echo '$#:' $#;

おっと、ちょっと複雑そうですね。
Linux標準教科書でも少し説明が出てきますが、これではあまりわからないので

少し補足します。シェルスクリプトでは特別な変数があります。

こちらも確認していただくことをお勧めします!

変数名 意味
$0 スクリプト
$1 ~ $9 1番目の引数を$1、2番目の引数を$2でアクセスできる
$# スクリプトに与えた引数の数
$* 全部の引数をまとめて1つとして処理
$@ 全部の引数を個別として処理
$? 直前実行したコマンドの終了値(0は成功、1は失敗)
$$ このシェルスクリプトのプロセスID
$! 最後に実行したバックグラウンドプロセスID

今回は、$1~$3の引数、$0(スクリプト名)、$#(スクリプトに与えた引数の数)を表示しようとしています。

それではコマンドを実行してみます。

$ ./args.sh aaa bbb ccc

$1: aaa # 引数1個目
$2: bbb # 引数2個目
$3: ccc # 引数3個目
$0: ./args.sh # 呼び出しているスクリプト名
$#: 3 # 引数の数

問題なく出力されました。

shift文

shiftコマンドは、引数の順序をずらします。
例えば、先どのargs.shでshiftを利用すると、$2が$1に、$3が$2・・・という感じで順序を変更することができます。

それでは早速argsshift.shファイルを作成して試してみます。

#!/bin/bash
echo '$1:' $1;
echo '$2:' $2;
echo '$3:' $3;
shift
echo '$1:' $1;
echo '$2:' $2;

それではshit文の動きを確認してみます。

$ ./argsshift.sh aaa bbb ccc

$1: aaa
$2: bbb
$3: ccc
$1: bbb #$1が$2に変更された
$2: ccc #$2が$3に変更された

※このshift文、自分なりに考えてもいつ使ったらいいのか思いつきませんでした。もしこんな時に使ったよという方はコメント欄等で教えていただけれると嬉しいです、

エスケープ

echoコマンド内などで"などを出力したい場合がある。
今回の例では、「Value of ABC is "123"」と出力させるようにしてみます。

まずは出力されない例から。

$ echo "Value of ABC is "$ABC""

Value of ABC is 123

これは、エスケープ文字を利用せずにダブルクォートで囲ってあり""は出力されていません。
ではエスケープ文字を利用してみます。

$ echo "Value of ABC is \"$ABC\""

Value of ABC is "123"

出力したい文字の前に\を入れることで""が出力されるようになりました。

今回はここまで次回もよかったらのぞいてくださいませ。