t0mmy

2020年12月30日に参加

学習履歴詳細

Shell Script 基礎

やったこと

書籍「新しいシェルプログラミングの教科書」

  • パラメータ展開
  • 文字列展開
  • 置換&展開
  • コマンド置換
  • 算術式評価

学んだこと

パラメータ展開

$(name:-sample)

左辺の変数部分が定義されている場合、左辺の変数の値を展開する。
未定義の場合、右辺の値を展開する。

  • この時、変数への代入は発生しない
${name:=sample}

左辺の変数部分が空ではない場合、左辺の変数の値を展開する。
空の場合、右辺の値を展開する。

  • この時、変数への代入が発生する

: を省略すると、変数に空文字が代入されているときの振る舞いが変化する。

$ name=
$ echo ${name:-sample}
sample
$ echo ${name-sample}

$
$ name=
$ echo ${name=sample}

$ echo ${name:=sample}
sample
$ echo $name
sample
${name:?hoge}

破片の変数が未定義の場合、右辺を標準エラー出力に表示する。

: がない場合の挙動は、 -= と同じ。

$ echo ${name:?undefined variable.}
-bash: name: undefined variable.
$ echo ${name?undefined variable.}

右辺を未設定だと、デフォルトメッセージが表示される。

デフォルトメッセージの方が、「ああ、 :? でエラーが発生しているんだな」と特定しやすいので、下手にエラーメッセージを自作しない方がいいかもしれない。

$ echo ${name:?}
-bash: name: parameter null or not set
$ echo ${name:+sample} 

左辺の変数が定義されている場合、右辺の文字列を展開する。
- の時と逆。
: を省略した場合の挙動も同じ。

文字列展開

$ name=sample

/*1番目から末尾まで表示*/
$ echo ${name:1}
ample

/*末尾から2文字を表示*/
$ echo ${name: -2}
le

/*1番目を起点に、3文字表示*/
$ echo ${name:1:3}
amp

/*先頭一番目から、末尾から1文字まで を表示*/
$ echo ${name:1:-1}
ampl

配列の展開でも、上記と同じ記法を用いる。

$ ary=(aaa bbb ccc ddd)

$ echo ${ary[@]:1}
bbb ccc ddd

$ echo ${ary[@]: -1}
ddd

$ echo ${ary[@]:1:2}
bbb ccc

/*これだけエラー*/
$ echo ${ary[@]:1:-1}
-bash: -1: substring expression < 0
$ echo $name
sample

$ echo ${#name} /*文字列の長さを取得*/
6
${name#hoge} 

hoge と前方一致した部分を取り除きつつ、変数展開する。

$ name=sample
$ echo ${name#sam}
ple

先頭が一致しない場合、何も取り除かれない。

$ echo ${name#smp}
sample

## で最長一致( # だと最短一致 )

$ file=sample.tar.gz
$ echo ${file#*.}
tar.gz
$ echo ${file##*.}
gz
${name%hoge}

hoge と後方一致した部分を取り除きつつ、変数展開する。

$ name=sample
$ echo ${name%ple}
sam

末尾が一致しない場合、何も取り除かれない。

$ echo ${name%mpl}
sample

## で最長一致( # だと最短一致 )

$ file=sample.tar.gz
$ echo ${file%.*}
sample.tar
$ echo ${file%%.*}
sample

例1) ファイル名だけ取り出す

$ echo ${file}
sample.tar.gz
$ echo ${file%%.*}
sample

例2) 拡張子だけ取り出す

$ echo ${file}
sample.tar.gz
$ echo ${file#*.}
tar.gz

例3) ファイルの絶対パスから、ファイル名だけ取り出す

$ log_path=/var/log/hoge.log
$ echo ${log_path##*/}
hoge.log

置換&展開

$ echo ${file}
sample.tar.gz

/*最初にマッチした部分を置換する*/
$ echo ${file/./_}
sample_tar.gz

/*マッチする部分は全部置換する*/
$ echo ${file//./_}
sample_tar_gz

コマンド置換

$ touch $(date +%Y-%m-%d)_hogehoge.log

$ ls
2022-06-12_hogehoge.log

算術式評価

$ x=8
$ y=20
$ ((z=x+y)) /*z => 28*/
$ let z=x+y /*z => 28*/

または、変数を整数型で宣言する。

$ declare -i sum
$ sum=x+y /*sum => 28*/
ShellScript

2022年06月12日(日)

2.0時間