lubuntu 初めてのシェルスクリプト その2

URLリストをもとに、youtubeから音源抽出するスクリプトの作成。単独URL指定、複数URL指定(無制限)、URLリスト指定のいづれにも対応とする。
コマンド名:youtube-dlm

(仕様)
#!/bin/bash
###################################################
#youtube-dlm (Extraction music from youtube movie)#
###################################################
#(usage)
#youtube-dlm url1 url2 url3 …. urln
#youtube-dlm -l (use music_url_list)
#youtube-dlm -l url_list
###################################################
#syorikubun変数宣言
#youtube-dlがインストールされているかチェック
##ない場合、「youtube-dlをインストールしてください」のメッセージ
##スクリプトを終了
#URLチェック関数 chkurlを定義 戻り値にOKの時0,NGの時1をセット
#音源抽出関数 cyuusyutuを定義 抽出に失敗すれば「urlの抽出に失敗しました」のメッセージを出力。結果はcyuusyutuokにOKの時”ok”NGの時”ng”をセット
#youtube-dl -x $1 で抽出
#全URLチェック関数 allchkurlを定義 すべての引数についてURLチェックを行い、エラーのURLがあれば「XXXXは不正なURLです」のメッセージを出力し、スクリプトを終了。
#URLチェックがすべてOKならば、処理区分に、bをセット。
#URLをチェック
#引数のパターンにより処理区分をセット
#処理区分
#a:単独URLによる音源抽出
#b:複数URLによる音源抽出
#c:オプション-lでURLリスト指定による音源抽出
#d:オプション-lでリスト指定無し、music_url_listによる音源抽出
#引数の個数をチェック
##引数が0の時
###メッセージを表示、スクリプトを終了
##引数が1つの時
###-lの時
####music_url_listの存在チェックを行い、存在すれば処理区分にdをセットする
###それ以外の時、関数chkurlを実行
###urlokがokの時処理区分にaをセット
###urlokがngの時、「URLを指定してください」のメッセージ表示、スクリプトを終了
##引数が2の時
###$1が-lの時、$2のファイル存在チェック、OKであれば、処理区分にcをセット
###$1がそれ以外の場合、allchkurlを実行。
###$1が3以上の場合、allchkurlを実行。
#以下処理区分により分岐
###処理区分がaの時 $1を引数にcyuusyutu実行。
###処理区分がbの時 $@を引数にcyuusyutu実行。
#音楽抽出
###処理区分がcの時 URLリストを全件読込、cyuusyutuを実行。
###処理区分がdの時 music_url_listを全件読込、URLチェックOKの場合、cyuusyutuを実行。
###処理区分が””の時 「想定外のエラーが発生しました」のメッセージ表示。

以上の仕様を実装するために必要な知識を調べます。

<すべての引数についてループ>

for arg in “$@”
do
処理 #引数の参照は、”$arg”で
done
<シェル関数>

スクリプト内で一定の処理を関数として定義して、使用することが出来ます。

定義

関数名()
{
処理
}

実行

関数名 [引数]

シェル関数の実行には引数をつけることができ、シェル関数内の位置パラメータは、一時的にシェル関数の引数で一時的に置き換えられます。
シェル関数の終了ステータスは、シェル関数内で最後に実行されたリストの終了ステータスになります。
シェル関数内の変数はグローバル変数のように扱われます。たとえば、シェル関数内で変数に値を代入すると、シェル関数からリターンした後も、その変数には値が代入されたままになります。
シェル関数の定義では{の記号が正しく認識されるように、{の直後には区切り文字としてのスペースまたは改行が必要です。
<シェルスクリプトの終了>

exitコマンドを実行すると、その時点でシェルスクリプトが終了します。引数で終了ステータスを指定できます。

構文 exit [終了ステータス]
<ファイルの存在チェック>

ファイルの存在チェックにはtestコマンドを用います。

test -f ファイルパス

真ならば終了ステータスは0、偽ならば終了ステータスは1になります。

<ファイルを1行ずつ読んでループする>

ファイルから、1行ずつ読込みループするには、「while read」の形式を使います。

while read line
do
echo $line
done < ファイルパス

<cace文>

case 文は C言語や Java言語の switch 文に該当する制御文で、if 文と同じように処理を分岐するために使用されるものです。分岐条件には判定対象となる 1つの値と、その値と照合される複数のパターンを指定します。

構文

case 値 in
パターン1 ) 処理1 ;;
パターン2 ) 処理2 ;;
パターン3 ) 処理3 ;;

パターンn ) 処理n ;;
esac

< アプリケーションの存在確認 >

typeコマンドを使用します。通常typeコマンドは、コマンドに関する情報を表示するコマンドです。ここでは、if文の条件式の中で使われていますが、コマンドの結果が0であれば、真と同じ意味になります。

if type アプリケーション > /dev/null 2>&1 ; then
echo “存在します”
else
echo “存在しません”
fi

<Geditの行数表示>

スクリプトが長くなってきたので、行数を表示するように設定します。
私は、もっぱらGeditを使用しているので、編集→設定→表示タブ→行番号を表示するにチェックでOKです。

以下以上の内容を使って作成したシェルスクリプトです。

#!/bin/bash
###################################################
#youtube-dlm (Extraction music from youtube movie)#
###################################################
#(usage)
#youtube-dlm url1 url2 url3 …. urln
#youtube-dlm -l (use music_url_list)
#youtube-dlm -l url_list
###################################################
#syorikubun変数宣言
syorikubun=””
#youtube-dlがインストールされているかチェック
if type youtube-dl > /dev/null 2>&1 ; then
:
else
##ない場合、「youtube-dlをインストールしてください」のメッセージ
echo “youtube-dlをインストールしてください”
##スクリプトを終了
exit
fi
#URLチェック関数 chkurlを定義 戻り値にOKの時0,NGの時1をセット
chkurl() {
urlcheck=$( wget –spider -nv -t 1 $1 2>&1 | grep -c ‘200 OK’ )
if test $urlcheck -eq 1; then
urlok=0
else
urlok=1
fi
return $urlok
}
#音源抽出関数 cyuusyutuを定義 抽出に失敗すれば「urlの抽出に失敗しました」のメッセージを出力。結果はcyuusyutuokにOKの時”ok”NGの時”ng”をセット
cyuusyutu() {
#youtube-dl -x $1 で抽出
youtube-dl -x $1 | grep Destination
return $?
}
#全URLチェック関数 allchkurlを定義 すべての引数についてURLチェックを行い、エラーのURLがあれば「XXXXは不正なURLです」のメッセージを出力し、スクリプトを終了。
#URLチェックがすべてOKならば、処理区分に、bをセット。
allchkurl() {
for x in “$@”
do
#URLをチェック
if chkurl “$x”;then
syorikubun=”b”
else
echo “$x”は不正なURLです。;exit
fi
done
if test $syorikubun==”b”;then
rtn=0
else
rtn=1
fi
return $rtn
}
#引数のパターンにより処理区分をセット
#処理区分
#a:単独URLによる音源抽出
#b:複数URLによる音源抽出
#c:オプション-lでURLリスト指定による音源抽出
#d:オプション-lでリスト指定無し、music_url_listによる音源抽出
#引数の個数をチェック
##引数が0の時
if test $# -eq 0;then
###メッセージを表示、スクリプトを終了
echo “URLまたは、オプション-l を指定してください。”;exit
fi
##引数が1つの時
if test $# -eq 1;then
if test $1 == “-l”;then
###-lの時
####music_url_listの存在チェックを行い、存在すれば処理区分にdをセットする
if test -f ./music_url_list;then
syorikubun=”d”
else
echo “music_url_listが存在していません”;exit
fi
###それ以外の時、関数chkurlを実行
else
###urlokがokの時処理区分にaをセット
if `chkurl $1`;then
syorikubun=”a”
else
###urlokがngの時、「URLを指定してください」のメッセージ表示、スクリプトを終了
echo “正しいURLを指定してください”;exit
fi
fi
fi
##引数が2の時
if test $# -eq 2;then
###$1が-lの時、$2のファイル存在チェック、OKであれば、処理区分にcをセット
if test $1 == “-l”;then
if test -f $2;then
syorikubun=”c”
else
echo $2″がURLリストとして存在していません”;exit
fi
###$1がそれ以外の場合、allchkurlを実行。
else
allchkurl “$@”
fi
fi
if test $# -ge 3;then
###$1が3以上の場合、allchkurlを実行。
allchkurl “$@”
fi
#以下処理区分により分岐
case $syorikubun in
###処理区分がaの時 $1を引数にcyuusyutu実行。
“a” ) cyuusyutu $1;;
###処理区分がbの時 $@を引数にcyuusyutu実行。
“b” ) bcnt=0
for x in “$@”
do
#音楽抽出
cyuusyutu “$x”
bcnt=`expr $bcnt + 1`
done
echo $bcnt “件を処理しました”
;;
###処理区分がcの時 URLリストを全件読込、cyuusyutuを実行。
“c” ) ecnt=0
while read line
do
if `chkurl $line`;then
:
else
ecnt=`expr $ecnt + 1`
echo $line “は不正なURLです”
exit
fi
done < “$2”
cnt=0
while read line
do
cnt=`expr $cnt + 1`
cyuusyutu $line
done < “$2”
echo $cnt “件を処理しました”
;;
###処理区分がdの時 music_url_listを全件読込、URLチェックOKの場合、cyuusyutuを実行。
“d” ) ecnt=0
while read line
do
if `chkurl $line`;then
:
else
ecnt=`expr $ecnt + 1`
echo $line “は不正なURLです”
exit
fi
done < ./music_url_list
cnt=0
while read line
do
cnt=`expr $cnt + 1`
cyuusyutu $line
done < ./music_url_list
echo $cnt “件を処理しました”
;;
###処理区分が””の時 「想定外のエラーが発生しました」のメッセージ表示。
“” ) echo “想定外のエラーが発生しました” ;;
esac

結構、スクリプトが長いのでテストパターンを作成しテストしました。

youtube-dlがインストールされている場合●
youtube-dlがインストールされていない場合●
パラメータなしで起動●
1つの正しいurlをパラメータで起動●
2つの正しいurlをパラメータで起動●
3つの正しいurlをパラメータで起動●
1つの誤ったurlをパラメータで起動●
1つの正しいurlと1つの誤ったurlで起動●
2つの正しいurlと1つの誤ったurlで起動●
4つの正しいurlで起動●
オプション-l のみのパラメータでmusic_url_listが存在し、複数のurlが登録されている場合●
オプション-l のみのパラメータでmusic_url_listが存在し、複数のurlが登録されていて、誤ったurlを含む場合●
オプション-l のみのパラメータでmusic_url_listが存在し、urlが登録されていない場合●
オプション-l で指定のurlリストファイルが存在し、複数のurlが登録されている場合●
オプション-l で指定のurlリストファイルが存在し、複数のurlが登録されていて、誤ったurlを含む場合●
オプション-l で指定のurlリストファイルが存在し、urlが登録されていない場合●

思ったよりも、文法エラー・構文エラーなどで苦労しました。あと、全角スペースを入れないように気をつけなければならないことを学びました。

投稿者: linux32bit

2017/04よりlubuntuをDimension2400cにインストール。 Linuxの勉強を始める。覚書として学習記録をつづる。

コメントを残す