2009-10-01から1ヶ月間の記事一覧

ファイル名を取得する関数

#f_askfname() - ファイル名を取得 #引数1 入力メッセージ #引数2 0:入力必須 1:未入力有効 #引数3 初期ファイル名(省略可、引数2が0の場合のみ有効) #戻り値 0:入力あり 1:入力なし _STR:入力文字列 # ask_fname(){ while :; do echo -n "$1" read _STR if …

ディレクトリ名を取得し存在しなければ作成する関数

#ask_directory() - ディレクトリ名の取得 #引数1 0:入力必須 1:ブランク時キャンセル 2:デフォルトはホームディレクトリ #引数2 入力メッセージ(省略可) #戻り値 0:入力あり 1:ブランク(キャンセル) _DIRNAME:入力ディレクトリ名 # ask_derectory(){ if [ $…

ディレクトリの存在を確認する関数

#check_directory() - ディレクトリの存在確認 #引数1 ディレクトリ名 #戻り値 0:ディレクトリ使用OK 1:上書き不可 2:ディレクトリ作成エラー # check_directory(){ if [ -d $1 ]; then while :; do echo -n "Overwrite $1 (y/n): " read _YN if [ "$_YN" = …

ディレクトリ名を取得する関数

#ask_directory() - ディレクトリ名の取得 #引数1 0:入力必須 1:ブランク時キャンセル 2:デフォルトはホームディレクトリ #引数2 入力メッセージ(省略可) #戻り値 0:入力あり 1:ブランク(キャンセル) _DIRNAME:入力ディレクトリ名 # ask_derectory(){ if [ $…

実行中のスクリプトの現在の行番号を調べる(bash)

bashでは変数LINENOに現在実行中の行番号が代入されている #!/bin/sh #lineno.sh func(){ echo "lineno.sh($LINENO): func()" } echo "lineno.sh($LINENO): func()" func func $ ./lineno.sh lineno.sh(8): func() lineno.sh(5): func() lineno.sh(5): func()

タイプした文字を画面に表示しないようにする

#!/bin/sh noecho.sh echo -n "Password: " #エコー禁止 stty -echo read password #エコー許可 stty echo if [ "$password" = "secret" ]; then echo "Open sesami!" else echo "Bye!" fi $ ./noecho.sh Password: Open sesami!

端末から1文字だけ読み込む

stty wawコマンドを実行すると端末はrawモードに設定され 入力1文字ごとにデータをプログラムに渡すようになる 端末を元に戻すには stty -raw とする #!/bin/sh #getchar.sh echo "Hit any key!" stty raw -echo char=`dd bs=1 count=1 2>/dev/null` stty -r…

複数の項目から選択する(bash)

bashにはユーザーに複数の項目から数字で選択させるための select文が用意されている #!/bin/sh #select.sh #シェル変数PS3の内容がプロンプトとして表示される PS3="Which fruits do you like? " select fruit in apples oranges bananas "I'm full!"; do c…

Yes/Noを問い合わせる

readで読み込みcaseで判断する #!/bin/sh #yesno.sh yesno(){ yn_result="" while [ -z "$yn_result" ]; do read yn_reply case "$yn_reply" in [yY][eE][sS]) yn_result=0;; [nN][oO]) yn_result=1;; *) echo "Please enter YES or NO.";; esac done return…

書式を設定してメッセージを表示する

printfは文字列や数値の書式を整えて表示する 書式の指定方法はC言語のprintf関数と似ている #!/bin/sh #printf.sh printf '1: <%5d> <%05d> <%-5d> \n' 123 123 123 printf '2: <%5.2f> <%05.f> <%.3e>\n' 1.234 1.234 1.234 printf '3: <%s> <%-10s> <%.5s…

自分自身のファイル名に応じてスクリプトの動作を変える

よく似た動作のプログラムが複数必要な場合、1つのプログラムに 複数の名前のリンク作成し、呼び出された名前によってプログラムの 詳細な動作を変える方法をとることがある。 (例えばgnuzipはgzipへのリンクになっていることがある) 変数$0には実行中のスク…

コマンドラインオプションを解析する

#!/bin/sh #getopts.sh opt_f="(none)" opt_g="(none)" opt_h="NO" while getopts f:g:h flag; do case $flag in f) opt_f="$OPTARG";; g) opt_g="$OPTARG";; h) opt_h=YES;; esac done echo "-f $opt_f" echo "-g $opt_g" echo "-h $opt_h" shift `expr $OP…

テキストファイルを配列に読み込む(bash)

array=(word)と書くとカッコの中が単語に分割され それぞれの単語が配列arrayの要素として格納される IFSを改行のみのしておくと、1行が1要素の配列になる #!/bin/sh #linenum.sh if [ $# -ne 1 ]; then echo "Usage: linenum_bash.sh filename" exit 1 fi I…

テキストを1行ずつ読み込む

#!/bin/sh #linenum.sh if [ $# -ne 1 ]; then echo "Usage: linenum.sh filename" exit 1 fi IFS=' ' ln=0 #標準入力から1行ずつ読み込み、行番号と共に表示 while read -r line; do ln=`expr $ln + 1` printf '%3d %s\n' "$ln" "$line" done < "$1" $ ./li…

テキストファイルを一定の大きさに分割する

#!/bin/sh #log_split.sh lpf=100 #100行ごとに分割 if [ $# -ne 1 ]; then echo "Usage: log_split.sh logfile" exit 1 fi #対象ファイルの名前とディレクトリ名を除いた名前をセット logfile="$1" splitbase=`basename "$1"`. #ファイルを分割し分割に成功…

ディレクトリ内のファイルの一覧を得る

単にディレクトリ内のファイルの一覧がほしい場合は lsコマンドやfindコマンドではなく*を使う方が手軽 #!/bin/sh #dir.sh dir="$1" set -- "$dir"/* echo "Directory: $dir" echo "Number of files: $#" echo "List of files:" for name do echo " $name" d…

ファイルのiノード番号を調べる

ls -i の出力を加工する #!/bin/sh #file_inode.sh set -- `ls -i -d "$1"` echo "$1" $ ./file_inode.sh 1.text 1407374883568432

ファイルのアクセス権を調べる

#!/bin/sh #fileperm.sh [ -r "$1" ] && rp="readable" || rp="not readable" [ -w "$1" ] && wp="writable" || wp="not writable" [ -x "$1" ] && xp="executable" || xp="not executable" echo "$1 is $rp, $wp and $xp." $ ./fileperm.sh 1.text 1.text i…

ファイルの所有者を調べる

ls -l の出力を加工する #!/bin/sh #fileowner.sh if [ $# -ne 2 ]; then echo "Usage: fileowner.sh -u|-g filename" exit 1 fi case "$1" in "-u" ) show="user" ;; "-g" ) show="group" ;; * ) echo "$1: unknown option" exit 1 esac set -- `ls -l -d "…

2つのファイルの新旧を比較する

#!/bin/sh #file_datecmp.sh if [ $# -ne 2 ]; then echo "Usage: file_datecmp.sh file1 file2" exit 1 fi [ -e "$1" ] || { echo "$1 does not exist"; exit 1; } [ -e "$2" ] || { echo "$2 does not exist"; exit 1; } if [ "$1" -nt "$2" ]; then echo …

指定されたパスがファイルなのかディレクトリなのか調べる

#!/bin/sh #fileordir.sh if [ -e "$1" ]; then if [ -d "$1" ]; then echo "$1 is a directory" else echo "$1 is a file (regular or special)" fi else echo "$1 is does not exist" fi $ ./fileordir.sh 1.text 1.text is a file (regular or special)

ディレクトリの大きさを調べる

#!/bin/sh #dirsize.sh if [ $# -ne 1 ]; then echo "Usage: dirsize.sh dirname" exit 1 fi set -- `du -ks "$1"` expr $1 \* 1024 $ ./dirsize.sh /home/anmino 1198080

ファイルの大きさを調べる

ls -lの結果を加工する 単語への分割はawkを使うこともできる #!/bin/sh #filesize.sh if [ $# -ne 1 ]; then echo "Usage: filesize.sh filename" exit 1 fi set -- `ls -l "$1"` echo $5 $ ./filesize.sh 1.text 14

ディレクトリが存在するか調べる

#!/bin/sh #dir_exist.sh if [ -d "$1" ]; then echo "$1 exists" else echo "$1 dose not exist" fi $ ./dir_exist.sh /home /home exists

ファイルが存在するか調べる

#!/bin/sh #file_exist.sh if [ -f "$1" ]; then echo "$1 exists" else echo "$1 does not exist" fi $ ./file_exist.sh 1.text 1.text exists

正規表現を使ってファイル名を変更する(sed)

#!/bin/sh #rename_sed.sh if [ $# -lt 3 ]; then echo "Usage: rename_sed.sh regexp replace files..." exit 1 fi #正規表現と置き換え文字列をセット regexp="$1" pattern="$2" shift 2 #残りの引数で指定されたファイルについて繰り返し処理 for orig do…

相対パスから絶対パスを得る

相対パスを絶対パスに変換する一般的な方法は用意されていない 相対パスの前にカレントディレクトリを付け足し.や..を処理することで 絶対パスに変換しています。 #!/bin/sh #relpath2abs.sh if [ -z "$1" ]; then echo "Usage: reopath2abs.sh path" exit 1…

ファイル名の拡張子を変更する

古い拡張子を取り除いた後、新しい拡張子を付ける #!/bin/sh #chgext.sh if [ $# -lt 2 ]; then echo "Usage: chgext.sh .newext files..." exit 1 fi newext="$1" shift #新しい拡張子が.で始まっていない場合付け加える expr "$newext" : '\.' >/dev/null …

ファイル名の拡張子を調べる

#!/bin/sh #countext.sh count=0 for fname in *; do ext=`expr "$fname" : '.*\(\..*\)'` if [ "$ext" = "$1" ]; then count=`expr $count + 1` fi done echo $count $ ./countext.sh .sh 33

ファイル名から拡張子を取り除く

#!/bin/sh #rmext.sh #exprを使った処理 rmext_expr(){ bname=`expr "$1" : '\(.*\)\.'` [ $? -eq 0 ] && echo "$bname" || echo "$1" } #sedを使った処理 rmext_sed(){ echo "$1" | sed 's/\.[^.]*$//' } rmext_expr "$1" rmext_sed "$1" $ ./rmext.sh abc.…