スポンサーリンク
2013年10月19日
blogを投稿する際にランダムなファイル名が必要になりましたが、毎回何らかのツールで生成するのが面倒なので、TextExpanderで対応できれば嬉しいなと思い調べてみました。
調べてみるとTextExpanderでShell Scriptが使え、Shell Scriptでランダムな文字列を簡易に生成できることが分かりました。
Shell Scriptはあまり触ったことがないので、勉強がてらに試してみます。
早速スクリプトです。最後に参考にしたサイトがあります。
#!/bin/sh len=12 char='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890' char_len=${#char} i=0 while [ $i -lt $len ] do start=$(( ($RANDOM % $char_len) )) str=${str}${char:${start}:1} i=$(( i+1 )) done printf $str
L.1:shebang
L.2:変数lenに12を代入。ここで文字数を決める。代入に$は不要。=の前後のスペースはNG。
L.3:利用する文字列。ここからランダムに1文字ずつ取り出してランダムな文字列を生成する。
L.4:${#char}) – 文字列の長さを取得する。char_len=62
L.5:iに0を代入。whileの条件判定用。
LL.6-11:while文。[]内は条件。”-lt”(less than)は他の言語でいうところの”<”。つまり、i<12となる。
$(( ($RANDOM % $char_len) )) – `expr ($RANDOM % $char_len)` とも書ける。
$RANDOMは0〜32767の中からランダムな数値が取り出される。
($RANDOM % $char_len) – %は剰余を求めるので、結果は0〜61となる。
L.9:${char:${start}:1} – charのstart位置から1文字取得する。つまりcharからランダムに1文字取得する。
例えば、startが0であれば、0から1文字はA、61であれば、61から1文字は0となる。
${str}${char:${start}:1} – 文字列を連結する。whileで12回繰り返し、ランダムに1文字ずつ連結して、最終的な文字列を生成する。
L.10:whileの判定用のiをインクリメントする。
L.12:結果を出力する。ここの出力がTextExpanderの実行結果となる。
#はコメント。変数の前に$をつけると参照。
実行結果(標準出力)を変数に代入する場合は、バッククォート( ` )で囲むか、$( )とする。
変数を波括弧{ }で囲むと、変数が明確になりスクリプトの可読性が高まる。
シングルクォート( ‘ ‘ )文字列として出力
ダブルクォート( “ “ )変数の中身を文字列として出力
バッククォート( ` ` )コマンドの標準出力。$()と同じ。
標準だとContent:がプレインテキストとなっているので、Shell Scriptに変更します。 後はいつもと同じです。先ほどのスクリプトをペーストしてabbreviation(省略形、省略語)を設定します。
もう少し重複を避けるような処理を含めたほうがよさそうですが、重複が致命的でない部分だと十分ですね。
mkpasswdや/dev/randomを利用すると良いそうです。
mkpasswdを試してみましたが動きません、調べてみるとMacはデフォルトでmkpasswdが入ってないんですね。代わりにpwgenがインストールを含めて簡単に使えるということでした。
/dev/randomは動作しました。あまり中身を調べずに試してみましたが、たまにファイル名に不適切というか使いたくない文字が出てきます。もう少し調べてからかと思います。
#!/bin/sh head -c 6 /dev/random | uuencode -m – | sed -n '2s/=*$//;2p'
はじめはTypeIt4Meが安かったので、そちらを使っていましたが、設定画面を開くとほぼ確実に落ちていました。そんなこともあり、TextExpanderにしています。こちらのほうがスニペットの管理がしやすく、これまで安定して動作しています。
せっかく購入したので、TypeIt4Meもじっくりと使って比較してみたいのですが、2013年2月20日から一度も更新がないので、少し諦めています。そのうち、アップデートされたらまた試そうかなと思いますが、ちょっと期待できないですね。
Sell Script以外にAppleScriptも実行できるんですね。たまにAppleScriptを触るので、楽しめそうです。