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