linuxでテキストファイルに記述されたコマンド群を1行ずつ読み出し、標準出力にプリントした後ユーザに実行するかどうか確認して処理するbashスクリプト。
実行したいコマンドが記述されたファイルを引数として与えると、最初に1行ずつcmd変数に格納、その後問い合わせながら1行ずつ実行します。
中断する場合は、ctrl-Cを押すと、break(再開可能で中断)か、continue(戻る)か、end(終了)か聞かれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/bin/bash cmd= i=0 shopt -s extglob handler () { while true ; do echo -en "\nbreak or continue or end? (b/c/e) > " read ans case "${ans}" in "b") iskil=true break ;; "c") iskil=false break ;; "e") exit 0 ;; esac done if ${iskil} ; then kill -s SIGTSTP $$ ; fi continue } while read -r ln ; do if [[ ${ln} != *( |\t) ]] ; then cmd[$((i++))]=${ln} fi done < $1 trap handler SIGINT for (( i = 0; i < ${#cmd[*]}; )) ; do echo -n "${i} : [ ${cmd[${i}]} ] (y/n) > " read ans; case "${ans}" in "y") eval "${cmd[(( i++ ))]}" echo -e "return [$?]\n" ;; "n") (( i++ )) ;; esac done |
実行結果は以下のような感じ。
例)test.txtの内容を実行する。
1 2 3 4 5 6 7 8 9 10 11 |
id uname -a date ifconfig #comment echo -e "\ntest\n" |
実行例
saru@ubuntu:~/test$ ./test.sh test.txt 0 : [ id ] (y/n) > y uid=1000(saru) gid=1000(saru) groups=1000(saru),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),110(sambashare) return [0] 1 : [ uname -a ] (y/n) > y 2 : [ date ] (y/n) > y 3 : [ ifconfig ] (y/n) > n 5 : [ echo -e “\ntest\n” ] (y/n) > y test return [0] saru@ubuntu:~/test$ ./test.sh test.txt 1 : [ uname -a ] (y/n) > ^C 1 : [ uname -a ] (y/n) > y 2 : [ date ] (y/n) > ^C [1]+ 停止 ./test.sh test.txt 2 : [ date ] (y/n) > y 3 : [ ifconfig ] (y/n) > ^C |