🧞

シェルスクリプトの基礎③~コマンド置き換え~

2021/01/10に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんにはシェルのコマンドを格納しておくシェルスクリプトというファイルがあるらしいのでそれをまとめてみた。

概要

シェルスクリプトの
■コマンド置き換え
■位置パラメータ

をまとめてみた^^

■コマンド置き換え

複数のコマンドラインをシェルスクリプトに書いていると、コマンドの出力結果をシェルスクリプトで利用したいと思うことがある。
そんな時はコマンド置き換えができる。
コマンドを置き換えをするには、

$(コマンド)

と記述する。

現在の日時をタイトルにしたファイルを作成せよ
$ cat datename.sh
#! /bin/bash
datename=$(date '+%Y-%m-%d')    (※$()でコマンドを囲う)
touch "$datename" (コマンドを囲って変数を指定)

$ source ./datename.sh

$ ls
2021-01-10  bin  datename.sh    (今日の日付のファイルができた!)

コマンドの置き換えがあるから環境変数で$と指定することができなかったのか!
$()は別の書き方もできる!

別の書き方例
$ echo "today is $(date '+%Y-%m-%d')" 
today is 2021-01-10
※↑も↓も同じ$ echo today is `date '+%Y-%m-%d'` 
today is 2021-01-10

`(バッククォート)でもコマンド置き換えすることができるが結構見えずらいので
$()でコマンドを囲ったほうが見やすいとおもった!('_')

■位置パラメータ

まって('_')パラメータって誰!

シェルスクリプトには前にやったawkコマンドのように、フィールドを指定して引数を指定することもできる。シェルスクリプトではコマンドライン記述した時の引数のあるフィールドを位置パラメータという('_')

位置パラメータの位置
   ↓$0(実行時のシェルスクリプト)                 
$ ./parameters.sh suidou female himitu
          ↑$1    ↑$2      ↑$3

↓このように位置パラメータを指定すれば参照することができる。

位置パラメータを使って参照
$ cat ./parameters.sh (シェルスクリプトの中身)
#! /bin/bash
echo "\$ファイル名 = $0"   (※頭に$を付けたかったから変数展開しないで
echo "\$名前 = $1"        って意味で頭に\を付けた!←)
echo "\$性別 = $2"
echo "\$年齢 = $3"

$ ./parameters.sh suidou female himitu  (※権限変更してね!) 
$ファイル名 = ./parameters.sh
$名前 = siudou
$性別 = female
$年齢 = himitu

位置パラメータすごい('_')!

■引数の個数の参照

コマンドラインで指定された引数の個数の参照は特殊パラメータ$#という変数で参照することができる。
特殊パラメータ変数!('_')

$ cat ./parameters.sh
#! /bin/bash
echo "\$ファイル名 = $0"
echo "\$名前 = $1"
echo "\$性別 = $2"
echo "\$年齢 = $3"
echo "\入力個数 = $#"   (特殊パラメータ変数記述!)

$ ./parameters.sh suidou female himitu 
$ファイル名 = ./parameters.sh
$名前 = siudou
$性別 = female
$年齢 = himitu
$入力個数= 3      (特殊パラメータ変数が発動された!)

■引数全体の参照

コマンドラインの引数をまとめて出力するにはどうしたらいいのか。
コマンドラインを分割せずにまとめて扱うには$と記述する。

まとめて扱う
$ cat matomeru.sh
#! /bin/bash
echo "全部 = $@"

$ ./matomeru.sh suidou female himitu
全部 = suidou female himitu

■シェルスクリプトの引数を別のコマンドに渡す(ラッパーする)

また、$@はシェルスクリプトの引数を別のコマンドにそのまま引き渡すのにも使える。

例えば何かの処理をしてから他のコマンドにそのまま引数を引き渡したいとき。

ラッパーシェルスクリプトから引継ぎコマンドへ
$ cat wrapper.sh
#! /bin/bash
export LANG=C
./hikitugi.sh "$@     (引数がまるごとhikitugi.shへ引継がれる)

export LANG=Cしてからhikitugi.shへ引数全てが引継がれた。('_')

まとめ

コマンドライン引数関連のシェル変数

|変数|内容|
| --- | --- | --- |
|$0|特殊パラメータ、実行時のシェルスクリプト名|
|$1.$2..|コマンドライン引数の値、位置パラメータ|
|$#|位置パラメータの個数|
|$@|全ての位置パラメータ|

明日って会社休みなのかな('_')?

Discussion