2009-01-01から1年間の記事一覧

実行結果を一定フォーマットで表示する関数

#disp_memo() - メもデータの表示 #引数1 メモ日付 #引数2 メモ時間 #引数3 メモタイトル #引数4 メモ本体 # disp_memo(){ echo "-------------------------" echo "Data : $(date -d $1 '+%y/%m/%d') $(date -d $2 '+%k:%M')" echo "Title : $3" echo "Text…

パスワードを生成する関数

#ファイル名 f_mkpasswd.sh #目的 パスワードの生成 #引数1 文字数 #戻り値 0:正常終了 1:引数不足 _MKPASSWD: 生成パスワード make_passwd(){ _PWCHAR=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L …

単位を変換する関数

#convert_size() - 単位変換 #引数1 0:KMGからBに変換 1:BからKMGに変換 #引数2 変換文字列 #戻り値 0:正常終了 1:変換エラー _RETSIZE:変換後のサイズ # convert_size(){ _RETSIZE=$2 _GBYTE=1024000000 _MBYTE=1024000 _KBYTE=1024 if [ $1 -eq 0 ]; then …

入力値が日付かどうかを判定する関数

#check_date() - 日付チェック #引数1 文字列(日付を意味する文字列か?) #戻り値 0:日付 1:日付でない # check_date(){ if [ $# -ne 1 ]; then return 1 fi date -d "$1" > /dev/null 2>&1 if [ $? -eq 0 ]; then return 0 fi return 1 } $ . f_chkdate.sh $…

入力値が数値であるか判定する関数

#check_num() - 数値チェック #引数1 チェックする文字列 #戻り値 0:数値 1:数値でない # check_num(){ if [ $# -ne 1 ]; then return 1 fi expr "$1" + 1 > /dev/null 2>&1 if [ $? -le 1 ]; then return 0 fi return 1 } $ . f_chknum.sh $ check_num 1; e…

文字列を取得する関数

#ask_string() - 文字列を取得 #引数1 入力メッセージ #引数2 0:入力必須 1:未入力有効 #戻り値 0: 入力あり 1:未入力 _STR:入力文字列 # ask_string(){ echo -n "$1" while read _STR; do if [ ! "$_STR" ]; then if [ $2 -eq 1 ]; then return 1 fi else r…

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

#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