‘shellscript’ タグのついている投稿

シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。(修正)

2010年5月2日 Linux, スクリプト関連, 雑記

長~いURLを短縮させようとすると短縮自体は成功するのに本文への反映がされないという現象を確認してしまったので急遽修正版。
修正と言っても1行消しただけなので、その他の仕様は前回と変わってない。

使い方とかはこの辺参照。

#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1” | sed -e ‘s/http/nhttp/g’ -e ‘s/ftp/nftp/g’ -e ‘s/ /n/g’ | grep tp://` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
  #配列2は諸事情により削除されました。
  #goo.glで配列のURLを短縮URLに/配列3へ流し込み
  array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array[i]}” | sed ‘s/”/n/g’ | grep tp://`
  #変数strのURL部分を差し替え
  str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
  then
    #id、passリストから1行目を読み込み。※書式 id:pass
    IPS=`sed -n 1p ~/working/shellscript/ips.list`
    curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
  exit 0
else
  echo ‘文字数多いみたい。’
  exit 1
fi

ガチな暫定コード。これからxAuthに対応させようと思っているので、出来たらまたコード更新の予定。しぇるすくりぷったーとか参考にしようかと思ったけども、Pythonで生で実装してるコードを公開している方がいたので、勉強がてらそっちを移植してみようと思うよ。

そこまで出来れば投稿部分に関してはTwitterクライアントのシェルスクリプト実装の中では最強だもんね。あくまで投稿部分のみだけど。

シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。

2010年4月21日 Linux, スクリプト関連, 雑記

行けた行けた。半角スペースの入った引数つけるときは二重引用符じゃダメなのねw
何はともあれ上手く行ったので公開。制限事項は多分前回のものとほとんど変わらずURLの中に「スペース」が混じるとそこで区切られちゃう点。

使い方は簡単でスクリプトの実行時に引数として投稿内容を単引用符(Shift+7 のヤツ)で括ったものを付けて実行するだけ。一応複数のURLでも大丈夫。
URLと本文の切り分けに半角スペースを使っているので、半角スペースを含むURLには前述の通り使えない。

その辺のことは前回の記事を自分で読んだり実際に動かしてみたりして確認してくだしあ。
いま何か頭が働かないんだ。そんなわけで最終成果物。

#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1” | sed -e ‘s/http/nhttp/g’ -e ‘s/ftp/nftp/g’ -e ‘s/ /n/g’ | grep tp://` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
  #URLエンコード/配列2へ流し込み
  array2[i]=`echo “${array[i]}” | nkf -eMQ | tr = %`
  #goo.glで配列2のURLを短縮URLに/配列3へ流し込み
  array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array2[i]}” | sed ‘s/”/n/g’ | grep tp://`
  #変数strのURL部分を差し替え
  str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
  then
    IPS=`sed -n 1p ~/working/shellscript/ips.list`
    curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
  exit 0
else
  echo ‘文字数多いみたい。’
  exit 1
fi

大まかな処理の流れはコメント行の通り。
コメント行読んでどうにかしろっていうのもアレな感じのコードなので、流れだけもうちょっと詳しく書いておく。

まずは1~4行目 変数strに第一引数の中身を代入。次に配列変数arrayにURLを抽出し抽出結果を代入。
5~13行目 for文で配列に含まれる要素の数の分だけ処理。配列変数array2にURLエンコードされたarrayの中身を代入。array2の中身をgoo.glに投げて配列変数array3に結果を代入。変数strのURL部分を差し替えて上書き。
14~23行目 文字数を軽く確認して141文字未満ならつぶやく。そうでないならエラーで終了。

こんな感じ。あ、言うほど面倒くさくなかったね。どうでも良いけどいつも通りインデントが全角なのでそこだけ注意してください。

さ、あとは仕掛かりのリスト生成をこなせば、いつも通りまったり絵を描いて過ごせるよ。

ふぉふぉふぉ、役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

GoogleのURL短縮サービスgoo.glを(ry 続き1。

2010年4月19日 Linux, スクリプト関連, 雑記

シェルスクリプトのみで地味に進行中。
ひとまず、文中に含まれるURLっぽい文字列をgoo.glに投げて短縮URLを受け取って文中のURLを置き換える所までできた。
ただ、このままだと、複数のURLが含まれたときに困ったことになってしまうので、そこら辺まだ手を入れていかないといけない。

一応、試してみたい人のために使い方。

スクリプト実行時に引数として二重引用符で囲った文字列をつけて実行する。だけ。
あとはスクリプトが文字列中に含まれるURLっぽい文字列を短縮URLに置き換えてくれる。
ただ、実はこれ制限があってURLの中に「スペース」「()」が混じってると多分うまくいかなかったり、URLの末尾に半角スペースが無いと、本文との切り分けができずにわけ分かんないことになったりする。

「スペース」に関しては原因は明確で、URLと本文の切り分けに使ってるからなんだけども、「()」の方は、エスケープしないと構文エラーになっちゃうからという何とも言えない原因。ここちょっといまいち調べが足りてないので、いまいちはっきりしたことは言えないんだけども、どうしたものかしらと思ってる。

で、これが今の所の暫定コード。
これに、Twitterの投稿スクリプトを組み込めば、URLを自動で短縮URLに加工して投稿してくれるTwitter投稿クライアントが出来る。

#!/bin/bash
str=`echo “$1” | grep tp://[0-9a-zA-Z@”#$%&’*+,-./] `
case “${#str}” in
  0 ) echo ${#str} $str ;;
  * ) echo $str | sed -e ‘s/http/nhttp/g’ -e ‘s/ftp/nftp/g’ -e ‘s/ /n/g’ >test.txt
  str2=`cat test.txt | grep tp://` ;;
esac
curl -G “http://ggl-shortener.appspot.com/?url=”`echo “$str2” | nkf -eMQ | tr = %` | sed ‘s/”/n/g’ | grep http >test2.txt
str3=`cat test2.txt`
echo `cat test.txt | sed “s%$str2%$str3%g”` >test2.txt

処理の流れなんかの説明は一通り形になってからやるつもり。ごちゃついてるけど、そんなに難しいこともやってないし。

数値文字参照の問題解決した。

2010年4月16日 Linux, スクリプト関連, 雑記

末尾一行だけ差し替え。
w3mが標準で入ってたので、これでデコードする。
あとの細かいところはまたあとでやる。

#!/bin/bash
IDPASS=`sed -n $1p ~/dir/ips.list`
curl -u $IDPASS -o ~/dir/friends_timeline.xml http://twitter.com/statuses/friends_timeline.xml
grep ‘<text>’ ~/dir/friends_timeline.xml | sed -e ‘s/</text>| <text>//g’ >~/dir/test.html
w3m -dump ‘~/dir/test.html’ >~/dir/test.txt

GoogleのURL短縮サービスgoo.glをシェルスクリプトから使う。

2010年4月16日 Linux, スクリプト関連, 雑記

やってみたかっただけw
これだけじゃ使い道は無いのでTwitterにからめてもうちょっと拡張してみるつもり。

#!/bin/bash
curl -G “http://ggl-shortener.appspot.com/?url=”`echo “$1” | nkf -eMQ | tr = %` | sed ‘s/”/n/g’ | sed -n ‘/http/p’

何のひねりもないけども、使いようによっては結構便利に使えるかもしれない。

もしかするとnkfコマンドが無い環境もあるかもしれないので入ってなかったらやさしく入れてあげてください。

ここまでやった。出来てるのか自信無いけど。

2010年4月12日 スクリプト関連, 雑記

もう何がなんだか・・・
あとはprintの所をHTML::Entitiesで置き換えれば良いのかな?

とりあえず今できるのはこのくらい。
もう寝なきゃ。

#!/bin/bash
IDPASS=`sed -n $1p ~/dir/ips.list`
curl -u $IDPASS -o ~/dir/friends_timeline.xml http://twitter.com/statuses/friends_timeline.xml
grep ‘<text>’ ~/dir/friends_timeline.xml | sed -e ‘s/</text>| <text>//g’ >~/dir/test.txt
perl -e ‘open(IN, “< ~/dir/test.txt”); while(<IN>){print $_;}’

shellscriptでどんぶり勘定。

2010年3月26日 Linux, スクリプト関連, 雑記

【シェルスクリプトでTwitterに投稿。リストで台詞生成編】
【シェルスクリプトでTwi(ry — prompter関数の中身。】
この辺のスクリプトで使っていた caseで変数の値を評価して、値を丸めて変数を上書きするコード、これ何か長ったらしくてやだなぁと思って、ちょっと電車の中で考えてみて、いま書いてみた。結果・・・

#!/bin/bash
mt=$((`date ‘+%M’` / 10))0

ここまで縮みました。
見ての通り。dateで現在の時刻(分)を10で割って末尾に0を追加して変数mtに代入という流れ。

一見ダメそうに見えるけども、どうも10で割っても小数点以下がバッサリ切り捨てられて整数値しか帰ってこないのでこれで動いちゃう。とってもお行儀が悪い気がするけどもどうかなぁ・・・

ちなみにこっちでもいける。

#!/bin/bash
mt=$((`date ‘+%M’` / 10 * 10))

どちらもやりたかったことはこれ。↓↓

case “$mt” in
  0* ) mt=00 ;;
  1* ) mt=10 ;;
  2* ) mt=20 ;;
  3* ) mt=30 ;;
  4* ) mt=40 ;;
  5* ) mt=50 ;;
esac

split的な何かが必要なんじゃないかとビクビクしてたのに、意外に空気読んでくれちゃうんだな。

Kindle用の画像zipを作ってくれるスクリプトが地味にヤバそうだったので直した。

2010年3月10日 Linux, スクリプト関連, 雑記

間違えてディレクトリの指定無とかで実行しちゃったときユーザルートのファイルが光の速さでお亡くなりになるのは正直アレ過ぎるのでディレクトリの指定が空だったり、解像度指定が空だったりしたときにエラーで終了するようにした。

追加したのは太字部分。
想定しているエラーの条件は以下の通り。

・ディレクトリの指定を忘れて解像度の指定のみ入れた場合 — この場合は当然exit。
・ディレクトリの指定、解像度の指定の両方を忘れた場合 — この場合は解像度指定の段階でexit。
・解像度の指定を忘れた場合 — この場合は解像度指定の段階でexit。
・存在しないディレクトリを指定した場合 — この場合はcdの実行失敗で$?に1が入っているはずなのでexit。

ホントは削除する前にお伺いを立てるようなのの方がやり方としてお行儀いい気もするけども、いちいち消すか消さないかっていうメッセージのところで処理が止められてるのも邪魔くさいのでそれはしない方向で。

使い方はそのまま。ディレクトリと対象機器(k2、kdx)を引数として付けて実行。

#!/bin/bash
case “$1” in
  k2 | kdx ) echo “err:ディレクトリが指定されていません。”
  exit 1
  ;;
  * ) cd $1 ;;
esac
case “$?” in
  1 ) echo “err:ディレクトリの指定が間違っています。”
  exit 1
  ;;
esac

#対象機器の解像度指定
##k2 — Kindle2
##kdx — Kindle DX
case “$2” in
  k2 ) rez=800 ;;
  kdx ) rez=1200 ;;
  * ) echo “err:対象機器が指定されていません。”
  exit 1
  ;;

esac
#拡張子を配列に
ext=( jpg JPG jpeg JPEG gif GIF png PNG )
for (( i = 0; i < 8; i++ ))
{
  #画像ファイルのみのリスト生成
  ls | grep .${ext[i]} >>zlist.lst
}
#リスト行数取得
p=`wc -l <zlist.lst`
for (( i = 0; i < $((p + 1)); i++ ))
{
  case “$i” in
    0 ) ;;
    * )
      #ファイルサイズ変更後、元ファイル削除
      val=`printf “%03d” $i`
      flname[i]=`sed -n “$i”p zlist.lst`
      convert -resize “$rez”x”$rez” “${flname[i]}” p”$val”.jpg
      rm “${flname[i]}”
    ;;
  esac
}
bn=`basename $1`
zip ../”$bn”.zip *.*
rm *.*
cd ..
rmdir “$bn”

例によって例のごとくインデントが全角です。

役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

Kindle用の画像zipを作ってくれるスクリプト。

2010年3月5日 スクリプト関連, 雑記

とりあえずで【1】のスクリプトを書いたんだけど、
いちいちファイル名を整えて・・・とかやるのが面倒くさくなってきちゃったので、新しく【2】に書き直した。
使い方は実行の時にディレクトリと対象機器(k2、kdx)を引数として付けて実行するだけ。
実行すると実際にファイルが処理されようがされまいが最終的に指定ディレクトリ内のファイルが全て削除されるので、万一使うような場合はその辺気をつけて使ってください。

【1】

#!/bin/bash
cd $1
p=`ls | wc -l`
c=1
for (( i = 0; i < $((p + 1)); i++ ))
{
  val=`printf “%03d” $c`
  val2=”p””$val”
  convert -resize 800×800 “$val””.jpg” “$val2″”.jpg”
  rm “$val””.jpg”
  c=$((c + 1))
}

【2】

#!/bin/bash
cd $1
#対象機器の解像度指定
##k2 — Kindle2
##kdx — Kindle DX
case “$2” in
  k2 ) rez=800 ;;
  kdx ) rez=1200 ;;
esac
#拡張子を配列に
ext=( jpg JPG jpeg JPEG gif GIF png PNG )
for (( i = 0; i < 8; i++ ))
{
  #画像ファイルのみのリスト生成
  ls | grep .${ext[i]} >>zlist.lst
}
#リスト行数取得
p=`wc -l <zlist.lst`
for (( i = 0; i < $((p + 1)); i++ ))
{
  case “$i” in
    0 ) ;;
    * )
      #ファイルサイズ変更後、元ファイル削除
      val=`printf “%03d” $i`
      flname[i]=`sed -n “$i”p zlist.lst`
      convert -resize “$rez”x”$rez” “${flname[i]}” p”$val”.jpg
      rm “${flname[i]}”
    ;;
  esac
}
bn=`basename $1`
zip ../”$bn”.zip *.*
rm *.*
cd ..
rmdir “$bn”

地味に説明が面倒くさいのでとりあえず流れだけ説明。
・実行すると変数rezに解像度の値を代入、配列変数extに画像の拡張子を代入。
・画像ファイルのみのリスト生成、リスト行数取得。
・ファイルサイズ変更、ファイル名を連番にしつつ元ファイルを削除。
・変数bnに現在のディレクトリ名を代入、一つ上のディレクトリに書庫を作成。
・ファイル、ディレクトリ削除。

と言う流れ。気が向いたらそのうち詳しく説明するかもしれないけども期待はしない方が良い。
例によって例のごとくインデントが全角です。

役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

ゼロ埋め再び。

2010年3月2日 Linux, スクリプト関連, 雑記

イマイチ納得が行かないので色々調べてみてたら、どうやらbashではprintfが使えるらしいことを知った。
これで、フォーマット付きの文字列を簡単に取得できる。

数値をn桁で表示し、空の部分を0で埋めて返すスクリプト。(n)は数字が入る。カッコは必要ない。

printf “%0(n)d” 数値

たとえば printf “%06d” 1234 と書いてやれば 001234 という具合に表示される。
うん。満足。

書き忘れ。この記事は以下のサイトを参考にしましたリンク。
bash で前ゼロ埋めする – ablog