#ssmjp 2013.09.25.
@th0x0472
MAN OF BASH
INTO DEEPNESS
祝!Sphinx本発売
http://www.oreilly.co.jp/books/9784873116488/
サマリー。
最近たくさんシェルスクリプト書いた。
bashのmanを読んだ。
イロイロできるじゃん、すげー!
というわけで、manで調べたこと、試したことを
整理してシェアしますよ。
ディープと感じるかどうかは
個人差があります。
ディープと感じるかどうかは
個人差があります。
大事なことなので2回言います。
正直、色々できすぎて
おなかいっぱい。
今回は変数展開。
「今回は」といいましたが、
次回があるかは僕の検証能力次第です。
コマンドラインの操作をラクにするアレコレもありません。
まずはおさらい
% cat ./example0.sh
#!/bin/bash -x
VAR="bar"
echo ${VAR}
echo $VAR
実行すると
./example0.sh
+ VAR=bar
+ echo bar
bar
+ echo bar
bar
${VAR}
このとき、変数名のあとに
記号+アルファ付けるとイロイロできます。
Use Default Values.
word に指定した値がデフォルト値になる。
parameter に値が代入されていれば、
その値が使われる。
parameter になにも代入されていなければ、
デフォルト値が使われる。
paramet...
${parameter:-word}
#!/bin/bash -x
echo ${VAR}
echo ${VAR:-"foo"}
echo ${VAR}
VAR="bar"
echo ${VAR}
+ echo
+ echo foo
foo
+...
${parameter:=word}
デフォルト値を代入する。
wordに指定した値がデフォルト値になる。
parameter に値が代入されていれば、
その値が使われる。
parameter になにも代入されていなければ、
デフォルト値が使わ...
${parameter:=word}
#!/bin/bash -x
echo ${VAR}
echo ${VAR:="foo"}
echo ${VAR}
VAR="bar"
echo ${VAR}
+ echo
+ echo foo
foo
+...
使ってみる(スクリプト)
% cat example1.sh
#!/bin/bash -x
PARAM1=${1:-"Default Value"}
echo ${PARAM1}
使ってみる (実行結果)
% ./example1.sh
+ PARAM1='Default Value'
+ echo Default Value
Default Value
% ./example1.sh "foo bar"
+ PARAM...
${parameter:?word}
値が代入されていなければ、エラーになって
スクリプトがそこで終了する。
このとき word に指定した文が出力される。
リターンコードは1でした。
${parameter:?word}
#!/bin/bash -x
VAR="ABC"
echo ${VAR:?"error."}
+ VAR=ABC
+ echo ABC
ABC
${parameter:?word}
#!/bin/bash -x
VAR=""
echo ${VAR:?"error."}
+ VAR=
./example4.sh: line 4:
VAR: error.
使ってみる(スクリプト)
% cat ./example2.sh
#!/bin/bash -x
PARAM1=${1:?"何か引数を指定してよ"}
echo ${PARAM1}
使ってみる (実行結果)
% ./example2.sh "foo bar"
+ PARAM1='foo bar'
+ echo foo bar
foo bar
% ./example2.sh
./example2.sh: line 2: 1:...
${parameter:+word}
Use Alternate Value.
word に指定した値が Alternate Value になる。
parameter に値が代入されていれば、
Alternate Value が使われる。
pa...
${parameter:+word}
#!/bin/bash -x
VAR="foo"
echo ${VAR}
echo ${VAR:+"bar"}
echo ${VAR}
+ VAR=foo
+ echo foo
foo
+ echo bar...
${parameter:+word}
#!/bin/bash -x
echo ${VAR}
echo ${VAR:+"bar"}
VAR="foo"
echo ${VAR}
+ echo
+ echo
+ VAR=foo
+ echo foo
...
${parameter:offset}
${parameter:offset:length}
offset から{末尾まで,lengthだけ}切り出す。
parameter の値は変更されない。
offset のカウントは0から始まる。
off...
${parameter:offset}
#!/bin/bash -x
VAR="1234"
echo ${VAR:2}
+ VAR=1234
+ echo 34
34
${parameter:offset:length}
#!/bin/bash -x
VAR="1234"
echo ${VAR:1:2}
+ VAR=1234
+ echo 23
23
${parameter:offset:length}
#!/bin/bash -x
VAR="にほんご"
echo ${VAR:1:2}
+ VAR=$'?201??
201??202223?
201224'
+ echo $'?201??
2...
${parameter:offset} は
echo ${VAR} | cut -c N- を置き換えられる。
${parameter:offset:length} は
echo ${VAR} | cut -c N-M を置き換えられる。
${...
${parameter:offset}
#!/bin/bash -x
VAR="01234567"
echo ${VAR:4}
echo ${VAR} | cut -c 5-
+ VAR=01234567
+ echo 4567
4567
+ ...
${parameter:offset:length}
#!/bin/bash -x
VAR="01234567"
echo ${VAR:2:2}
echo ${VAR} | cut -c 3-4
+ VAR=01234567
+ echo 23...
${#parameter}
parameterに代入されている値の長さが返される。
${#parameter}
#!/bin/bash -x
VAR_E="English"
echo ${#VAR_E}
VAR_J="にほんご"
echo ${#VAR_J}
+ VAR_E=English
+ echo 7
7
+ VAR_J...
スクリプト
#!/bin/bash -x
VAR="0123456789"
echo ${VAR:$((${#VAR} - 5)):2}
実行結果
+ VAR=0123456789
+ echo 56
56
入れ子もOK!
楽しくなってくるけど...
${VAR:$((${#VAR}-5)):2}
${#VAR} → VAR の長さ = 10
$((${#VAR} - 5)) = 10 - 5 = 5
${VAR:$((${#VAR} - 5)):2} = ${VAR:5:2}
VAR=”0...
${parameter#word}
${parameter%word}
parameter の{先頭,末尾}でwordにマッチした
部分を削除した値を返す。
# → 先頭
% → 末尾
${parameter#word}
#!/bin/bash -x
VAR="0123456789"
echo ${VAR#012}
+ VAR=0123456789
+ echo 3456789
3456789
${parameter%word}
#!/bin/bash -x
VAR="0123456789"
echo ${VAR%789}
+ VAR=0123456789
+ echo 0123456
0123456
合わせ技は失敗
#!/bin/bash -x
VAR="0123456789"
echo $
{VAR#123%789}
+ VAR=0123456789
+ echo 0123456789
0123456789
リベンジ・・・失敗。
#!/bin/bash -x
VAR="0123%7894567
89"
echo $
{VAR#123%789}
+
VAR=0123%789456789
+ echo
0123%789456789
0123%78945...
実は・・・
${parameter##word}
${parameter%%word}
もあるんだけど・・・・
正直、違いが分かりませんでした。
教えてエライ人。
${parameter#word} , ${parameter%word}
manによれば、この二つは、shortest match
${parameter##word} , ${parameter%%word}
manによれば、 この二つは、...
parameter のうち pattern に最初にマッチした部分
を string に置き換える。
${parameter/pattern/string}
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCDEFG"
echo ${VAR/ABC/abc}
+ VAR=ABCDEFG
+ echo abcDEFG
abcDEFG
${parameter/pattern/string}
pattern が # ではじまると、 parameter の
先頭でマッチしたとき string に置き換えられる。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCDEFG"
echo ${VAR/#ABC/abc}
echo ${VAR/#DEF/def}
echo ${VAR/DEF/def}
+ V...
${parameter/pattern/string}
pattern が % ではじまると、 parameter の
末尾でマッチしたとき string に置き換えられる。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCDEFG"
echo ${VAR/%EFG/efg}
echo ${VAR/%DEF/def}
echo ${VAR/DEF/def}
+ V...
${parameter/pattern/string}
string が空っぽだと、parameter のうち
pattern にマッチした部分が削除される。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCDEFG"
echo ${VAR/DEF}
echo ${VAR/DEF/}
+ VAR=ABCDEFG
+ echo ABCG
ABCG
+...
${parameter/pattern/string}
parameter のうち pattern に最初にマッチした部分
を string に置き換える。
つまり、pattern に複数箇所マッチしても、
置き換えられるのは最初の1回だけ。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCABC"
echo ${VAR/AB/ab}
+ VAR=ABCABC
+ echo abCABC
abCABC
${parameter/pattern/string}
patternの大文字・小文字は区別される。
${parameter/pattern/string}
#!/bin/bash -x
VAR="abCABC"
echo ${VAR/AB/XY}
+ VAR=abCABC
+ echo abCXYC
abCXYC
${parameter/pattern/string}
pattern に . (ドット、ピリオド)を指定しても
任意の1文字にはならない
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCD"
echo ${VAR/./Z}
+ VAR=ABCD
+ echo ABCD
ABCD
${parameter/pattern/string}
pattern に ? を指定すると任意の1文字になる。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCD"
echo ${VAR/?/Z}
echo ${VAR/??/XY}
+ VAR=ABCD
+ echo ZBCD
ZBCD
+ echo...
${parameter/pattern/string}
pattern に * を指定すると何でもマッチする。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCD"
echo ${VAR/*/XYZ}
echo ${VAR/A*/XYZ}
echo ${VAR/B*/XYZ}
+ VAR=ABCD
+...
${parameter/pattern/string}
pattern に [ABC] [1-9] なんかもいけた。
${parameter/pattern/string}
#!/bin/bash -x
VAR="ABCD"
echo ${VAR/[BC]/X}
+ VAR=ABCD
+ echo AXCD
AXCD
${parameter/pattern/string}
#!/bin/bash -x
VAR="0123"
echo ${VAR/[1-4]/X}
+ VAR=0123
+ echo 0X23
0X23
僕は力尽きました
しかし、変数展開だけでみても
まだ手を出せてない機能があります。
配列関連の機能とか
“変数名”に展開する機能とか
いつか踏み込んでみたいです。
おしまい。
ご静聴ありがとうございました。
Upcoming SlideShare
Loading in …5
×

MAN OF BASH #ssmjp 2013.09.25

462 views

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
462
On SlideShare
0
From Embeds
0
Number of Embeds
65
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

MAN OF BASH #ssmjp 2013.09.25

  1. 1. #ssmjp 2013.09.25. @th0x0472 MAN OF BASH INTO DEEPNESS
  2. 2. 祝!Sphinx本発売 http://www.oreilly.co.jp/books/9784873116488/
  3. 3. サマリー。 最近たくさんシェルスクリプト書いた。 bashのmanを読んだ。 イロイロできるじゃん、すげー! というわけで、manで調べたこと、試したことを 整理してシェアしますよ。
  4. 4. ディープと感じるかどうかは 個人差があります。 ディープと感じるかどうかは 個人差があります。 大事なことなので2回言います。
  5. 5. 正直、色々できすぎて おなかいっぱい。 今回は変数展開。 「今回は」といいましたが、 次回があるかは僕の検証能力次第です。 コマンドラインの操作をラクにするアレコレもありません。
  6. 6. まずはおさらい % cat ./example0.sh #!/bin/bash -x VAR="bar" echo ${VAR} echo $VAR
  7. 7. 実行すると ./example0.sh + VAR=bar + echo bar bar + echo bar bar
  8. 8. ${VAR} このとき、変数名のあとに 記号+アルファ付けるとイロイロできます。
  9. 9. Use Default Values. word に指定した値がデフォルト値になる。 parameter に値が代入されていれば、 その値が使われる。 parameter になにも代入されていなければ、 デフォルト値が使われる。 parameter に word は代入されない。 ${parameter:-word}
  10. 10. ${parameter:-word} #!/bin/bash -x echo ${VAR} echo ${VAR:-"foo"} echo ${VAR} VAR="bar" echo ${VAR} + echo + echo foo foo + echo + VAR=bar + echo bar bar
  11. 11. ${parameter:=word} デフォルト値を代入する。 wordに指定した値がデフォルト値になる。 parameter に値が代入されていれば、 その値が使われる。 parameter になにも代入されていなければ、 デフォルト値が使われる。 parameter に word は代入される。
  12. 12. ${parameter:=word} #!/bin/bash -x echo ${VAR} echo ${VAR:="foo"} echo ${VAR} VAR="bar" echo ${VAR} + echo + echo foo foo + echo foo foo + VAR=bar + echo bar bar
  13. 13. 使ってみる(スクリプト) % cat example1.sh #!/bin/bash -x PARAM1=${1:-"Default Value"} echo ${PARAM1}
  14. 14. 使ってみる (実行結果) % ./example1.sh + PARAM1='Default Value' + echo Default Value Default Value % ./example1.sh "foo bar" + PARAM1='foo bar' + echo foo bar foo bar
  15. 15. ${parameter:?word} 値が代入されていなければ、エラーになって スクリプトがそこで終了する。 このとき word に指定した文が出力される。 リターンコードは1でした。
  16. 16. ${parameter:?word} #!/bin/bash -x VAR="ABC" echo ${VAR:?"error."} + VAR=ABC + echo ABC ABC
  17. 17. ${parameter:?word} #!/bin/bash -x VAR="" echo ${VAR:?"error."} + VAR= ./example4.sh: line 4: VAR: error.
  18. 18. 使ってみる(スクリプト) % cat ./example2.sh #!/bin/bash -x PARAM1=${1:?"何か引数を指定してよ"} echo ${PARAM1}
  19. 19. 使ってみる (実行結果) % ./example2.sh "foo bar" + PARAM1='foo bar' + echo foo bar foo bar % ./example2.sh ./example2.sh: line 2: 1: 何か引数を指定してよ % echo $? 1
  20. 20. ${parameter:+word} Use Alternate Value. word に指定した値が Alternate Value になる。 parameter に値が代入されていれば、 Alternate Value が使われる。 parameter になにも代入されていなければ、 からっぽのまま。 parameter に word は代入されない。
  21. 21. ${parameter:+word} #!/bin/bash -x VAR="foo" echo ${VAR} echo ${VAR:+"bar"} echo ${VAR} + VAR=foo + echo foo foo + echo bar bar + echo foo
  22. 22. ${parameter:+word} #!/bin/bash -x echo ${VAR} echo ${VAR:+"bar"} VAR="foo" echo ${VAR} + echo + echo + VAR=foo + echo foo foo
  23. 23. ${parameter:offset} ${parameter:offset:length} offset から{末尾まで,lengthだけ}切り出す。 parameter の値は変更されない。 offset のカウントは0から始まる。 offset が文字列長より大きいとからっぽになる。 offset に負の値を指定するとスルーされる。
  24. 24. ${parameter:offset} #!/bin/bash -x VAR="1234" echo ${VAR:2} + VAR=1234 + echo 34 34
  25. 25. ${parameter:offset:length} #!/bin/bash -x VAR="1234" echo ${VAR:1:2} + VAR=1234 + echo 23 23
  26. 26. ${parameter:offset:length} #!/bin/bash -x VAR="にほんご" echo ${VAR:1:2} + VAR=$'?201?? 201??202223? 201224' + echo $'?201?? 202223' ほん
  27. 27. ${parameter:offset} は echo ${VAR} | cut -c N- を置き換えられる。 ${parameter:offset:length} は echo ${VAR} | cut -c N-M を置き換えられる。 ${parameter:offset} ${parameter:offset:length}
  28. 28. ${parameter:offset} #!/bin/bash -x VAR="01234567" echo ${VAR:4} echo ${VAR} | cut -c 5- + VAR=01234567 + echo 4567 4567 + echo 01234567 + cut -c 5- 4567
  29. 29. ${parameter:offset:length} #!/bin/bash -x VAR="01234567" echo ${VAR:2:2} echo ${VAR} | cut -c 3-4 + VAR=01234567 + echo 23 23 + echo 01234567 + cut -c 3-4 23
  30. 30. ${#parameter} parameterに代入されている値の長さが返される。
  31. 31. ${#parameter} #!/bin/bash -x VAR_E="English" echo ${#VAR_E} VAR_J="にほんご" echo ${#VAR_J} + VAR_E=English + echo 7 7 + VAR_J=$'?201?? 201??202223? 201224' + echo 4 4
  32. 32. スクリプト #!/bin/bash -x VAR="0123456789" echo ${VAR:$((${#VAR} - 5)):2} 実行結果 + VAR=0123456789 + echo 56 56 入れ子もOK! 楽しくなってくるけど やり過ぎに注意。
  33. 33. ${VAR:$((${#VAR}-5)):2} ${#VAR} → VAR の長さ = 10 $((${#VAR} - 5)) = 10 - 5 = 5 ${VAR:$((${#VAR} - 5)):2} = ${VAR:5:2} VAR=”01234567890” offset 5 の位置の文字は、5。 そこから length=2 で、 56 が切り出される。 ご利用は計画的に。
  34. 34. ${parameter#word} ${parameter%word} parameter の{先頭,末尾}でwordにマッチした 部分を削除した値を返す。 # → 先頭 % → 末尾
  35. 35. ${parameter#word} #!/bin/bash -x VAR="0123456789" echo ${VAR#012} + VAR=0123456789 + echo 3456789 3456789
  36. 36. ${parameter%word} #!/bin/bash -x VAR="0123456789" echo ${VAR%789} + VAR=0123456789 + echo 0123456 0123456
  37. 37. 合わせ技は失敗 #!/bin/bash -x VAR="0123456789" echo $ {VAR#123%789} + VAR=0123456789 + echo 0123456789 0123456789
  38. 38. リベンジ・・・失敗。 #!/bin/bash -x VAR="0123%7894567 89" echo $ {VAR#123%789} + VAR=0123%789456789 + echo 0123%789456789 0123%789456789
  39. 39. 実は・・・ ${parameter##word} ${parameter%%word} もあるんだけど・・・・ 正直、違いが分かりませんでした。 教えてエライ人。
  40. 40. ${parameter#word} , ${parameter%word} manによれば、この二つは、shortest match ${parameter##word} , ${parameter%%word} manによれば、 この二つは、longest match 何となく意味は分かるような、 でも違いがハッキリ分かる例を作れませんでした。
  41. 41. parameter のうち pattern に最初にマッチした部分 を string に置き換える。 ${parameter/pattern/string}
  42. 42. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCDEFG" echo ${VAR/ABC/abc} + VAR=ABCDEFG + echo abcDEFG abcDEFG
  43. 43. ${parameter/pattern/string} pattern が # ではじまると、 parameter の 先頭でマッチしたとき string に置き換えられる。
  44. 44. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCDEFG" echo ${VAR/#ABC/abc} echo ${VAR/#DEF/def} echo ${VAR/DEF/def} + VAR=ABCDEFG + echo abcDEFG abcDEFG + echo ABCDEFG ABCDEFG + echo ABCdefG ABCdefG
  45. 45. ${parameter/pattern/string} pattern が % ではじまると、 parameter の 末尾でマッチしたとき string に置き換えられる。
  46. 46. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCDEFG" echo ${VAR/%EFG/efg} echo ${VAR/%DEF/def} echo ${VAR/DEF/def} + VAR=ABCDEFG + echo ABCDefg ABCDefg + echo ABCDEFG ABCDEFG + echo ABCdefG ABCdefG
  47. 47. ${parameter/pattern/string} string が空っぽだと、parameter のうち pattern にマッチした部分が削除される。
  48. 48. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCDEFG" echo ${VAR/DEF} echo ${VAR/DEF/} + VAR=ABCDEFG + echo ABCG ABCG + echo ABCG ABCG
  49. 49. ${parameter/pattern/string} parameter のうち pattern に最初にマッチした部分 を string に置き換える。 つまり、pattern に複数箇所マッチしても、 置き換えられるのは最初の1回だけ。
  50. 50. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCABC" echo ${VAR/AB/ab} + VAR=ABCABC + echo abCABC abCABC
  51. 51. ${parameter/pattern/string} patternの大文字・小文字は区別される。
  52. 52. ${parameter/pattern/string} #!/bin/bash -x VAR="abCABC" echo ${VAR/AB/XY} + VAR=abCABC + echo abCXYC abCXYC
  53. 53. ${parameter/pattern/string} pattern に . (ドット、ピリオド)を指定しても 任意の1文字にはならない
  54. 54. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCD" echo ${VAR/./Z} + VAR=ABCD + echo ABCD ABCD
  55. 55. ${parameter/pattern/string} pattern に ? を指定すると任意の1文字になる。
  56. 56. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCD" echo ${VAR/?/Z} echo ${VAR/??/XY} + VAR=ABCD + echo ZBCD ZBCD + echo XYCD XYCD
  57. 57. ${parameter/pattern/string} pattern に * を指定すると何でもマッチする。
  58. 58. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCD" echo ${VAR/*/XYZ} echo ${VAR/A*/XYZ} echo ${VAR/B*/XYZ} + VAR=ABCD + echo XYZ XYZ + echo XYZ XYZ + echo AXYZ AXYZ
  59. 59. ${parameter/pattern/string} pattern に [ABC] [1-9] なんかもいけた。
  60. 60. ${parameter/pattern/string} #!/bin/bash -x VAR="ABCD" echo ${VAR/[BC]/X} + VAR=ABCD + echo AXCD AXCD
  61. 61. ${parameter/pattern/string} #!/bin/bash -x VAR="0123" echo ${VAR/[1-4]/X} + VAR=0123 + echo 0X23 0X23
  62. 62. 僕は力尽きました しかし、変数展開だけでみても まだ手を出せてない機能があります。 配列関連の機能とか “変数名”に展開する機能とか
  63. 63. いつか踏み込んでみたいです。
  64. 64. おしまい。 ご静聴ありがとうございました。

×