greenteaの日記: シェルスクリプトむずい。 3
日記 by
greentea
文法が覚えらんない。man見ながら何度も走らせてやってみる感じ。。。
flacからmp3に変換するのをシェルスクリプトでやってみようと思ったんだけどね。
内容としては、flacファイルをtmpファイルにflac -dでデコードして
それをlameでmp3に変換という、非常に簡単な内容。
数分でできると思って書いてみた。
そしたらファイル名に空白が空いてるかも。そしたらどこにダブルクオテーションいるんだ、とか
出力先が省略されていたときの動作は、*.flacなら*.mp3に変換、
そうでなければ.mp3を付加ってしてみたり
出力先がディレクトリなら、そのディレクトリにmp3を出力とか、
そういう細かい所でつまづきまくる。
とりあえず書いたけど、もっと読みやすく書きやすい方法がある気がしてならない。
不慣れで汚いけど、せっかく作ったので貼るだけ貼っとこうかなぁ。
Usage: flac2mp3 input [output]
#!/bin/bash
LAMEOPTION="-h -b 256"
if [ "$1" == "" ] ; then
echo "No input file"
echo "Usage: $0 input [output]"
exit 1
fi
if [[ ! -a "$1" ]] ; then
echo "\"$1\" not found"
echo "Usage: $0 input [output]"
exit 1
fi
INPUTFILE=$1
if [ "$2" != "" ] ; then
if [ -d "$2" ] ; then
if [ "$1" != "${1%.flac}" ] ; then
OUTPUTFILE="${1/%.flac/.mp3}"
OUTPUTFILE="$2/${OUTPUTFILE##*/}"
else
OUTPUTFILE="$1.mp3"
OUTPUTFILE="$2/${OUTPUTFILE##*/}"
fi
else
OUTPUTFILE="$2"
fi
else
if [ "$1" != "${1%.flac}" ] ; then
OUTPUTFILE="${1/%.flac/.mp3}"
else
OUTPUTFILE="$1.mp3"
fi
fi
TEMPFILE=`mktemp`
flac -d -f -o "$TEMPFILE" "$INPUTFILE"
lame $LAMEOPTION "$TEMPFILE" "$OUTPUTFILE"
rm -f "$TEMPFILE"
flacからmp3に変換するのをシェルスクリプトでやってみようと思ったんだけどね。
内容としては、flacファイルをtmpファイルにflac -dでデコードして
それをlameでmp3に変換という、非常に簡単な内容。
数分でできると思って書いてみた。
そしたらファイル名に空白が空いてるかも。そしたらどこにダブルクオテーションいるんだ、とか
出力先が省略されていたときの動作は、*.flacなら*.mp3に変換、
そうでなければ.mp3を付加ってしてみたり
出力先がディレクトリなら、そのディレクトリにmp3を出力とか、
そういう細かい所でつまづきまくる。
とりあえず書いたけど、もっと読みやすく書きやすい方法がある気がしてならない。
不慣れで汚いけど、せっかく作ったので貼るだけ貼っとこうかなぁ。
Usage: flac2mp3 input [output]
#!/bin/bash
LAMEOPTION="-h -b 256"
if [ "$1" == "" ] ; then
echo "No input file"
echo "Usage: $0 input [output]"
exit 1
fi
if [[ ! -a "$1" ]] ; then
echo "\"$1\" not found"
echo "Usage: $0 input [output]"
exit 1
fi
INPUTFILE=$1
if [ "$2" != "" ] ; then
if [ -d "$2" ] ; then
if [ "$1" != "${1%.flac}" ] ; then
OUTPUTFILE="${1/%.flac/.mp3}"
OUTPUTFILE="$2/${OUTPUTFILE##*/}"
else
OUTPUTFILE="$1.mp3"
OUTPUTFILE="$2/${OUTPUTFILE##*/}"
fi
else
OUTPUTFILE="$2"
fi
else
if [ "$1" != "${1%.flac}" ] ; then
OUTPUTFILE="${1/%.flac/.mp3}"
else
OUTPUTFILE="$1.mp3"
fi
fi
TEMPFILE=`mktemp`
flac -d -f -o "$TEMPFILE" "$INPUTFILE"
lame $LAMEOPTION "$TEMPFILE" "$OUTPUTFILE"
rm -f "$TEMPFILE"
シェルスクリプトはたしかにむずい... (スコア:1)
OSの起動スクリプトみたいに、トラブル時でもなるべく動いてほしいスクリプトは/bin/shで書くけど、自分の日常的な作業をこなすときはここ5年くらいはもっぱらRubyだなあ。シェルスクリプトって、デバッグするのがとにかく難しいよね。echoくらいしかデバッグの道具がないからさ(俺が知らないだけ?)
最近はSBCLで日本語がけっこう不自由なく使えることがわかり、またPerl互換な正規表現エンジンもCommon Lispにあるとわかったので、日常的な仕事はSBCLでやるようにして身体を関数型言語にならしていこうとしてる。Clispをログインシェルにできるところまでいけば、最高だけどなあ。
Re:シェルスクリプトはたしかにむずい... (スコア:1)
けれども、外部コマンドを多用するスクリプトを書くなら
シェルスクリプトがいいなぁ、って考えるのは、頭が固いんですかね。
1を聞いて0を知れ!
Re:シェルスクリプトはたしかにむずい... (スコア:1)
昔、テキストを処理するフィルタを書くときにはAWK(jgawk)を使ってたんですが、AWKだと複数のファイルから入力をとるような場合にトリッキーな処理が必要になるんですよね。
Perlをおぼえてみたら、複数のファイルから入力をとる場合でも自然に書けたんです。それで、最初のころは「シンプルなフィルタはAWK」「それ以外はPerl」と使い分けていたのですが、考えてみると使い分ける理由がないんですね。
AWKで書けることはPerlでも十分にシンプルに書けたので、メモリ消費量とか、Perlはどのサーバにもインストールされているわけじゃないとか、そういう理由はあるけど、もうなんでもPerlでいいや、ってなった。
AWKで書いていると、機能を拡張しているうちにAWKでは難しくなることがあるんだけど、Perlにはそれがなかったから、最初からPerlで書く方が「袋小路」にはまらないだけいいな、ってね。
そんなわけで、シェルスクリプトも、Perlで置き換えた。
その後、PerlでできることはRubyでもできる、と気づいてRubyに移行して、今はLispへ移行中って感じですね。