ラベル bash の投稿を表示しています。 すべての投稿を表示
ラベル bash の投稿を表示しています。 すべての投稿を表示

2016年5月24日火曜日

Bashで算術演算

他人が書いたスクリプトを読んでいて、今更ながらBashの (( 数式 )) 記法を知った。manによると

       ((expression))
              The expression is evaluated according  to  the  rules  described
              below  under ARITHMETIC EVALUATION.  If the value of the expres-
              sion is non-zero, the return status is 0; otherwise  the  return
              status is 1.  This is exactly equivalent to let "expression".
とのこと。あくまでBashの組み込み機能なので、どんな環境でも使えるとは限らないけど。(( 数式 ))はダブルクオートで括っているのと同等のようで、乗算演算子の*をエスケープが不要なのが地味に嬉しい。

ついでに、

bash% echo $(( 1+2*3 ))
7
と頭に$を付ければ、その場で文字列にしてくれる。

でもまあ、可搬性を考えたらスクリプトではexprかな。

2015年12月13日日曜日

Dropbox Uploaderを使い始めた

たまに帰省すると、実家から戻って来たときにRaspberry Piに大量のradiko音源が貯まっていて、聞き終えるのが結構大変だったりする。そこで今年から来年にかけての帰省では、溜めずに実家でも聞こうと思い立った。

で、どうやって聞くか。もっとも単純なのは、物理的にRaspberry Piを実家に持っていく方法だろう。まあ、かさばるものでもないし。ただ問題は、Raspberry Piを持って移動している最中は録音できないこと。地味に厳しい制約なので、この方法は採用見送り。かと言って、今はLANでしか使っていないRaspberry Piを家の外からアクセスできるよう晒すのは、あまりに無防備。そこで思いついたのが、Dropboxを使おうというアイデア。

ちょっとググると、どうも公式のDropboxアプリはRaspberry Piで使えないけど、Dropbox Uploaderなるツールが使えるらしいということが分かったので、早速インストール。dropbox_uploader.shはBashスクリプトなので、適当にパスが通ったところに置くだけでOK。sed, basename, date, grep, stat, dd, mkdir, curlがあれば動くみたい。未設定の状態で起動するとConfiguration Wizardが始まるので、言われた通りに設定すれば良い。

注意点としては、どうもApp nameはユニークでなければならないということ。自分しか使わないから自由に命名できるわけではなく、世界中の他のDropboxアプリと重複しないような名前を付ける必要があるようだ。Configuration Wizardで例示してくれるMyUploader<乱数>という名前を使ってしまうのが、手っ取り早いだろう。きちんと名前をつけようかと思ったのだけれど、何度も既に使われていると言われて、名前を考えることを諦めてしまった。

ともあれ、これで年末の準備が1つ済んだ。

2012年2月21日火曜日

getoptsとシェルの選択


シェルついでにgetopsの話。getoptsを使うと、こんな感じでオプションのパーサを楽に書ける。
opt_a=
opt_b=
opt_c=
opt_d=
while getopts ‘abc:d:’ opt; do
  case $opt in
    a|b)
      eval “opt_$opt=1”;;
    c|d)
      eval “opt_$opt=’$OPTARG’”;;
  esac
done
shift `expr $OPTIND - 1`
上の例だと-aと-bが引数なし、-cと-dが引数ありのオプション。-abc ARGのように、複数のオプションをまとめて指定しても、きちんと解釈してくれる。引数ありのオプションは、-d ARGでも-dARGでもOK。
そんな便利なgetoptsの最大の弱点は、標準で備わっている保証がないこと。ただbashならgetoptsはbuilt-in化されているので、多少の可搬性を犠牲にしてでもgetoptsを使いたいときはshebangで
#!/bin/bash
と明示している。
ashでもbuilt-in化できることはできるが、ビルド時に無効にもできるので、ashならgetoptsが使えるという保証はできない。PCならともかく、組み込みだと切られているケースもあるかも。

2012年2月20日月曜日

Bシェル系の拡張変数展開とシェル選択



アンチcshとしては、Bシェル系でもcshの${var:e}みたいなことを条件付きでできることを示さざるを得ない。
  • ${var#pattern}は、varの先頭からpatternに最短一致した部分を取り除いた文字列
  • ${var##pattern}は、varの先頭からpatternに最長一致した部分を取り除いた文字列
  • ${var%pattern}は、varの末尾からpatternに最短一致した部分を取り除いた文字列
  • ${var%%pattern}は、varの末尾からpatternに最長一致した部分を取り除いた文字列

例えば

% var=foo/bar/baz.tar.gz
% echo ${var#*/}
bar/baz/tar.gz
% echo ${var##*/}
baz.tar.gz
% echo ${var%.*}
foo/bar/baz.tar
% echo ${var%%.*}
foo/bar/baz
% watch_out=foo.bar/baz.tar.gz
% echo ${watch_out%%.*}
foo
こんな感じ。
これはてっきりbashの拡張機能だと思っていたので、多少の可搬性を犠牲にしてでも楽をしたいときのみshebangで

#!/bin/bash
と指定して使っていた。が、実は割と初期のashで既に拡張されていたらしい。
http://www.in-ulm.de/~mascheck/various/ash/
手元のash/dashでは確かに#, %を使えた。ashは拡張されていないイメージだったので、意外。
まあashでも通ると言うだけで、Solarisの/bin/shとかだとやっぱり駄目なので、この機能を使うときはbashという選択で、引き続き問題ないかな。