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時間