shtool

来自「lzo-1.08-src.zip 高效的压缩解压代码」· 代码 · 共 1,936 行 · 第 1/5 页

TXT
1,936 行
字号
        opt_r=no        opt_d=no        opt_b=no        opt_m=no        opt_p="$PATH"        ;;    -* )        echo "$0:Error: unknown option \`$tool'" 2>&1        echo "$0:Hint:  run \`$0 -h' for usage" 2>&1        exit 1        ;;    * )        echo "$0:Error: unknown command \`$tool'" 2>&1        echo "$0:Hint:  run \`$0 -h' for usage" 2>&1        exit 1        ;;esac####  COMMON UTILITY CODE###   commonly used ASCII valuesASC_TAB="	"ASC_NL=""#   determine name of toolif [ ".$tool" != . ]; then    #   used inside shtool script    toolcmd="$0 $tool"    toolcmdhelp="shtool $tool"    msgprefix="shtool:$tool"else    #   used as standalone script    toolcmd="$0"    toolcmdhelp="sh $0"    msgprefix="$str_tool"fi#   parse argument specification stringeval `echo $arg_spec |\      sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`#   parse option specification stringeval `echo h.$opt_spec |\      sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`#   parse option alias stringeval `echo h:help,$opt_alias |\      tr 'x-' 'x_' | sed -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`#   interate over argument lineopt_PREV=''while [ $# -gt 0 ]; do    #   special option stops processing    if [ ".$1" = ".--" ]; then        shift        break    fi    #   determine option and argument    opt_ARG_OK=no    if [ ".$opt_PREV" != . ]; then        #   merge previous seen option with argument        opt_OPT="$opt_PREV"        opt_ARG="$1"        opt_ARG_OK=yes        opt_PREV=''    else        #   split argument into option and argument        case "$1" in            --[a-zA-Z0-9]*=*)                eval `echo "x$1" |\                      sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`                opt_STR=`echo $opt_OPT | tr 'x-' 'x_'`                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"                ;;            --[a-zA-Z0-9]*)                opt_OPT=`echo "x$1" | cut -c4-`                opt_STR=`echo $opt_OPT | tr 'x-' 'x_'`                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"                opt_ARG=''                ;;            -[a-zA-Z0-9]*)                eval `echo "x$1" |\                      sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \                          -e 's/";\(.*\)$/"; opt_ARG="\1"/'`                ;;            -[a-zA-Z0-9])                opt_OPT=`echo "x$1" | cut -c3-`                opt_ARG=''                ;;            *)                break                ;;        esac    fi    #   eat up option    shift    #   determine whether option needs an argument    eval "opt_MODE=\$opt_MODE_${opt_OPT}"    if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then        if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then            opt_PREV="$opt_OPT"            continue        fi    fi    #   process option    case $opt_MODE in        '.' )            #   boolean option            eval "opt_${opt_OPT}=yes"            ;;        ':' )            #   option with argument (multiple occurances override)            eval "opt_${opt_OPT}=\"\$opt_ARG\""            ;;        '+' )            #   option with argument (multiple occurances append)            eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\""            ;;        * )            echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2            echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2            exit 1            ;;    esacdoneif [ ".$opt_PREV" != . ]; then    echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2    echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2    exit 1fi#   process help optionif [ ".$opt_h" = .yes ]; then    echo "Usage: $toolcmdhelp $str_usage"    exit 0fi#   complain about incorrect number of argumentscase $arg_MODE in    '=' )        if [ $# -ne $arg_NUMS ]; then            echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2            echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2            exit 1        fi        ;;    '+' )        if [ $# -lt $arg_NUMS ]; then            echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2            echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2            exit 1        fi        ;;esac#   establish a temporary file on requestif [ ".$gen_tmpfile" = .yes ]; then    if [ ".$TMPDIR" != . ]; then        tmpdir="$TMPDIR"    elif [ ".$TEMPDIR" != . ]; then        tmpdir="$TEMPDIR"    else        tmpdir="/tmp"    fi    tmpfile="$tmpdir/.shtool.$$"    rm -f $tmpfile >/dev/null 2>&1    touch $tmpfile    chmod 600 $tmpfilefi####  DISPATCH INTO SCRIPT BODY##case $tool inecho )    ##    ##  echo -- Print string with optional construct expansion    ##  Copyright (c) 1998-2002 Ralf S. Engelschall <rse@engelschall.com>    ##  Originally written for WML as buildinfo    ##    text="$*"    #   check for broken escape sequence expansion    seo=''    bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`    if [ ".$bytes" != .3 ]; then        bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`        if [ ".$bytes" = .3 ]; then            seo='-E'        fi    fi    #   check for existing -n option (to suppress newline)    minusn=''    bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`    if [ ".$bytes" = .3 ]; then        minusn='-n'    fi    #   determine terminal bold sequence    term_bold=''    term_norm=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then        case $TERM in            #   for the most important terminal types we directly know the sequences            xterm|xterm*|vt220|vt220*)                term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`                term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`                ;;            vt100|vt100*)                term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`                term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`                ;;            #   for all others, we try to use a possibly existing `tput' or `tcout' utility            * )                paths=`echo $PATH | sed -e 's/:/ /g'`                for tool in tput tcout; do                    for dir in $paths; do                        if [ -r "$dir/$tool" ]; then                            for seq in bold md smso; do # 'smso' is last                                bold="`$dir/$tool $seq 2>/dev/null`"                                if [ ".$bold" != . ]; then                                    term_bold="$bold"                                    break                                fi                            done                            if [ ".$term_bold" != . ]; then                                for seq in sgr0 me rmso reset; do # 'reset' is last                                    norm="`$dir/$tool $seq 2>/dev/null`"                                    if [ ".$norm" != . ]; then                                        term_norm="$norm"                                        break                                    fi                                done                            fi                            break                        fi                    done                    if [ ".$term_bold" != . -a ".$term_norm" != . ]; then                        break;                    fi                done                ;;        esac        if [ ".$term_bold" = . -o ".$term_norm" = . ]; then            echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2        fi    fi    #   determine user name    username=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uUgG]'`" != . ]; then        username="$LOGNAME"        if [ ".$username" = . ]; then            username="$USER"            if [ ".$username" = . ]; then                username="`(whoami) 2>/dev/null |\                           awk '{ printf("%s", $1); }'`"                if [ ".$username" = . ]; then                    username="`(who am i) 2>/dev/null |\                               awk '{ printf("%s", $1); }'`"                    if [ ".$username" = . ]; then                        username='unknown'                    fi                fi            fi        fi    fi    #   determine user id    userid=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then        userid="`(id -u) 2>/dev/null`"        if [ ".$userid" = . ]; then            str="`(id) 2>/dev/null`"            if [ ".`echo $str | grep '^uid[ 	]*=[ 	]*[0-9]*('`" != . ]; then                userid=`echo $str | sed -e 's/^uid[ 	]*=[ 	]*//' -e 's/(.*//'`            fi            if [ ".$userid" = . ]; then                userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \                        sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`                if [ ".$userid" = . ]; then                    userid=`(ypcat passwd) 2>/dev/null |                            egrep "^${username}:" | \                            sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`                    if [ ".$userid" = . ]; then                        userid='?'                    fi                fi            fi        fi    fi    #   determine (primary) group id    groupid=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[gG]'`" != . ]; then        groupid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \                 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`        if [ ".$groupid" = . ]; then            groupid=`(ypcat passwd) 2>/dev/null | egrep "^${username}:" | \                     sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`            if [ ".$groupid" = . ]; then                groupid='?'            fi        fi    fi    #   determine (primary) group name    groupname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%g'`" != . ]; then        groupname=`egrep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \                   sed -e 's/:.*$//'`        if [ ".$groupname" = . ]; then            groupname=`(ypcat group) 2>/dev/null | \                       egrep "^[^:]*:[^:]*:${groupid}:" | \                       sed -e 's/:.*$//'`            if [ ".$groupname" = . ]; then                groupname='?'            fi        fi    fi    #   determine host and domain name    hostname=''    domainname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then        hostname="`(uname -n) 2>/dev/null |\                   awk '{ printf("%s", $1); }'`"        if [ ".$hostname" = . ]; then            hostname="`(hostname) 2>/dev/null |\                       awk '{ printf("%s", $1); }'`"            if [ ".$hostname" = . ]; then                hostname='unknown'            fi        fi        case $hostname in            *.* )                domainname=".`echo $hostname | cut -d. -f2-`"                hostname="`echo $hostname | cut -d. -f1`"                ;;        esac    fi    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then        if [ ".$domainname" = . ]; then            if [ -f /etc/resolv.conf ]; then                domainname="`egrep '^[ 	]*domain' /etc/resolv.conf | head -1 |\                             sed -e 's/.*domain//' \                                 -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \                                 -e 's/^\.//' -e 's/^/./' |\                             awk '{ printf("%s", $1); }'`"                if [ ".$domainname" = . ]; then                    domainname="`egrep '^[ 	]*search' /etc/resolv.conf | head -1 |\                                 sed -e 's/.*search//' \                                     -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \                                     -e 's/ .*//' -e 's/	.*//' \                                     -e 's/^\.//' -e 's/^/./' |\                                 awk '{ printf("%s", $1); }'`"                fi            fi        fi    fi    #   determine current time    time_day=''    time_month=''    time_year=''    time_monthname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then        time_day=`date '+%d'`        time_month=`date '+%m'`        time_year=`date '+%Y' 2>/dev/null`        if [ ".$time_year" = . ]; then            time_year=`date '+%y'`            case $time_year in                [5-9][0-9]) time_year="19$time_year" ;;                [0-4][0-9]) time_year="20$time_year" ;;            esac        fi

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?