如何使在shell下cp,mv等操作的时候显示进度条?

如何使在shell下cp,mv等操作的时候显示进度条?

有进度条提示的话,感觉心理更舒服些。呵呵。
总感觉自己有看走进度条癖。。。
好像没有这个选项,要不你自己写个脚本弄个出来吧
可以实现的。哈哈,用java可以实现。读文件写文件IO操作啊。。
rpm安装的时候是怎么实现的?
我想可能是这样实现的:

首先rpm安装包里面一定有很多文件,比如有10个文件。

在安装rpm时,其实内部是使用cp 一个一个复制文件,这样cp完一个文件里就在控制台输入一个#  ,cp完10个文件就会出输入出个# ,也可以按文件大小不同根据比例输入不同个数的#

例:
   [code:1]make[###########]  60%[/code:1]

当然这个进度条可能不太准确,但你看windows下软件安装及其他软件,都是这么做的。

还有一种办法是自己写个读写文件的工具 ,这样可以实现完全准确的控制条。不过意义好象不太大。

...
http://www.theiling.de/projects/bar.html
[code:1]#! /bin/sh

# bar
# 'cat' with ASCII progress bar
# (c) Henrik Theiling
BAR_VERSION=1.4

# Synopsis:
#   'bar' works just like 'cat', but shows a progress bar in ASCII art on stderr.
#   The script's main function is meant to be usable in any Bourne shell to be
#   suitable for install scripts without the need for any additional tool.
#
# Shell Script Usage: bar [options] [files]
# Options:
#     -h        displays help
#     ...
#
# Examples:
#   Normal pipe:
#
#     : bar mypack.tar.bz2 | tar xjpf -
#
#   Individual pipe for each file:
#
#     : bar -c 'tar xjpf -' mypack1.tar.bz2 mypack2.tar.bz2
#
#   Individual pipe, using ${bar_file} variable:
#
#     : bar -c 'echo ${bar_file}: ; gzip -dc | tar tvf -' \
#     :     -e .tar.gz \
#     :     file1 file2 file3 file4 file5 \
#     :         > package-list.txt

#####################################################
# Programs and shell commands:
#
# Required (otherwise this fails):
#
#    if, then, else, fi, expr, test, cat, eval, exec
#    shell functions
#
#    test:
#        a = b
#        a -lt b
#        a -gt b
#        a -le b
#        -f a
#        -n a
#        -z a
#
#    expr:
#        a + b
#        a - b
#        a '*' b
#        a / b
#        a : b
#
# Optional (otherwise this does not show the bar):
#
#    grep, dd, echo, ls, sed, cut
#
#    ls:
#        must output the file size at fifth position.
#
# The command line interface also uses:
#
#    awk
#

####>-SCHNIPP-<########################################################
bar_cat()
{
   # Use this shell function in your own install scripts.

   #####################################################
   # Options:

   # Width of the bar (in ten characters).  The default is 76 characters.
   test -z "${BAR_WIDTH}" && test -n "${COLUMNS}" && BAR_WIDTH=${COLUMNS}

   # Check syntax:
   ( expr "${BAR_WIDTH}" + 0 >/dev/null 2>&1 ) || BAR_WIDTH=0
   BAR_WIDTH=`expr ${BAR_WIDTH} + 0` || BAR_WIDTH=0
   test "x${BAR_WIDTH}" = x0 && BAR_WIDTH=76

   # Maximal block size to use for dd.
   test -n "${BAR_BS}" || BAR_BS=1048567

   # BEGIN PERC
   # Whether to show a percentage.
   test -n "${BAR_PERC}" || BAR_PERC=1
   # END PERC

   # BEGIN ETA
   # Whether to show estimated time of arrival (ETA).
   test -n "${BAR_ETA}" || BAR_ETA=1
   # END ETA

   # Width of the trace display:
   # BEGIN TRACE
   test -n "${BAR_TRACE_WIDTH}" || BAR_TRACE_WIDTH=10
   # END TRACE

   # The command to execute for every given file.  Each file
   # is piped into this command individually.  By default, the
   # files are simply dumped to stdout.
   test -n "${BAR_CMD}" || BAR_CMD=cat

   # The characters to be used in the bar
   test -n "${BAR_L}"  || BAR_L='['
   test -n "${BAR_R}"  || BAR_R=']'
   test -n "${BAR_C0}" || BAR_C0='.'
   test -n "${BAR_C1}" || BAR_C1='='

   # Additional extension to add to each file:
   #BAR_EXT=${BAR_EXT-}

   # Whether to clear bar after termination.  Otherwise keep the full bar.
   #BAR_CLEAR=${BAR_CLEAR-0}

   # Unless switched off by user, use the bar by default:
   test -n "${BAR_OK}" || BAR_OK=1

   #####################################################
   BAR_WIDTH=`expr ${BAR_WIDTH} - 3`

   bar_trace=''
   # BEGIN TRACE
   if test "x${BAR_TRACE}" = x1
   then
       BAR_WIDTH=`expr ${BAR_WIDTH} - ${BAR_TRACE_WIDTH}`
       bar_lauf=${BAR_TRACE_WIDTH}
       bar_t_space=''
       bar_t_dot=''
       while test "${bar_lauf}" -gt 1
       do
           bar_t_space="${bar_t_space} "
           bar_t_dot="${bar_t_dot}."
           bar_lauf=`expr ${bar_lauf} - 1`
       done
       bar_trace="${bar_t_space} "
   fi
   # END TRACE

   bar_eta=''
   BAR_GET_TIME='echo'
   # BEGIN ETA
   ( expr 1 + ${SECONDS} >/dev/null 2>&1 ) || BAR_ETA=0
   if test "x${BAR_ETA}" = x1
   then
       BAR_GET_TIME='( echo ${SECONDS} )'
       BAR_WIDTH=`expr ${BAR_WIDTH} - 6`
       bar_eta='--:-- '
   fi
   # END ETA

   bar_perc=''
   # BEGIN PERC
   if test "x${BAR_PERC}" = x1
   then
       BAR_WIDTH=`expr ${BAR_WIDTH} - 5`
       bar_perc='  0% '
   fi
   # END PERC

   BAR_GET_SIZE='( ls -l "${BAR_DIR}${bar_file}${BAR_EXT}" | sed "s@  *@ @g" | cut -d " " -f 5 ) 2>/dev/null'
       # portable?

   # check features:
   ( ( echo a                   ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | dd bs=2 count=2 ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | grep a          ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | sed 's@  *@ @g' ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | cut -d ' ' -f 1 ) >/dev/null 2>&1 ) || BAR_OK=0

   # check ranges:
   test "${BAR_WIDTH}" -ge 4 || BAR_OK=0

   BAR_ECHO='echo'
   BAR_E_C1=''
   BAR_E_C2=''
   BAR_E_NL='echo'

   # Does echo accept -n without signalling an error?
   if echo -n abc >/dev/null 2>&1
   then
       BAR_E_C1='-n'
   fi

   # Check how to print a line without newline:
   if ( ( ${BAR_ECHO} "${BAR_E_C1}" abc ; echo 1,2,3 ) | grep n ) >/dev/null 2>&1
   then
       # Try echo \c:
       if ( ( ${BAR_ECHO} 'xyz\c' ; echo 1,2,3 ) | grep c ) >/dev/null 2>&1
       then
           # Try printf:
           if ( ( printf 'ab%s' c ; echo 1,2,3 ) | grep abc ) >/dev/null 2>&1
           then
              BAR_ECHO='printf'
              BAR_E_C1='%s'
           else
              BAR_ECHO=':'
              BAR_E_C1=''
              BAR_E_NL=':'
              BAR_OK=0
           fi
       else
          BAR_E_C1=''
          BAR_E_C2='\c'
       fi
   fi

   # prepare initial bar:
   bar_shown=0
   if test "${BAR_OK}" = 1
   then
       bar_lauf=0
       bar_graph=''
       while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
       do
           bar_graph="${bar_graph}${BAR_C0}${BAR_C0}${BAR_C0}${BAR_C0}${BAR_C0}"
           bar_lauf=`expr ${bar_lauf} + 5`
       done
       while test "${bar_lauf}" -lt "${BAR_WIDTH}"
       do
           bar_graph="${bar_graph}${BAR_C0}"
           bar_lauf=`expr ${bar_lauf} + 1`
       done
       ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${BAR_L}${bar_graph}${BAR_R}
${BAR_E_C2}" 1>&2
       bar_shown=1
   fi

   # for shifting large numbers so that expr can handle them:
   # Assume we can compute up to 2147483647, thus 9 arbitrary digits.
   # We must be able to do + of two numbers of 9 digits length.  Ok.
   # BEGIN LARGE
   ( ( test 1999999998 = `expr 999999999 + 999999999` ) >/dev/null 2>&1 ) || BAR_OK=0
   bar_large_num="........."
   bar_div=""
   # END LARGE
   bar_numsuff=""

   # find size:
   bar_size=0
   if test -n "${BAR_SIZE}"
   then
       bar_size=${BAR_SIZE}
       # BEGIN LARGE
       while expr "${bar_size}" : "${bar_large_num}" >/dev/null 2>&1
       do
           bar_div="${bar_div}."
           bar_numsuff="${bar_numsuff}0"
           bar_size=`expr "${bar_size}" : '\(.*\).$'`
       done
       # END LARGE
       BAR_GET_SIZE="echo '${BAR_SIZE}'"
   else
       for bar_file
       do
           bar_size1=0
           if test -f "${BAR_DIR}${bar_file}${BAR_EXT}"
           then
               bar_size1=`eval "${BAR_GET_SIZE}"`

               # BEGIN LARGE
               # divide and upround by pattern matching:
               if test -n "${bar_div}"
               then
                   bar_size1=`expr "${bar_size1}" : '\(.*\)'${bar_div}'$'` || bar_size1=0
               fi

               # adjust if still too large:
               while expr "${bar_size1}" : "${bar_large_num}" >/dev/null 2>&1
               do
                   bar_div="${bar_div}."
                   bar_numsuff="${bar_numsuff}0"
                   bar_size1=`expr "${bar_size1}" : '\(.*\).$'`
                   bar_size=`expr "${bar_size}" : '\(.*\).$'` || bar_size=0
               done

               # upround if necessary:
               if test -n "${bar_div}"
               then
                   bar_size1=`expr "${bar_size1}" + 1`
               fi
               # END LARGE

               # add to total size:
               bar_size=`expr ${bar_size} + ${bar_size1}`

               # BEGIN LARGE
               # adjust if still too large:
               while expr "${bar_size}" : "${bar_large_num}" >/dev/null 2>&1
               do
                   bar_div="${bar_div}."
                   bar_numsuff="${bar_numsuff}0"
                   bar_size=`expr "${bar_size}" : '\(.*\).$'`
               done
               # END LARGE
           else
               BAR_OK=0
           fi
       done
   fi

   bar_quad=`expr ${BAR_WIDTH} '*' ${BAR_WIDTH}`
   test "${bar_size}" -gt "${bar_quad}" || BAR_OK=0

   if test "${BAR_OK}" = 0
   then
       # For some reason, we cannot display the bar.  Thus plain operation:
       for bar_file
       do
           if test "${bar_file}" = "/dev/stdin"
           then
               eval "${BAR_CMD}"
           else
               eval "${BAR_CMD}" < "${BAR_DIR}${bar_file}${BAR_EXT}"
           fi
       done
   else
       # Compute wanted bytes per step:
       bar_want_bps=`expr ${bar_size} + ${BAR_WIDTH}`
       bar_want_bps=`expr ${bar_want_bps} - 1`
       bar_want_bps=`expr ${bar_want_bps} / ${BAR_WIDTH}`

       # Compute block count per step to keep within maximum block size:
       bar_count=1
       if test "${bar_want_bps}" -gt "${BAR_BS}"
       then
           bar_count=`expr ${bar_want_bps} + ${BAR_BS}`
           bar_count=`expr ${bar_count} - 1`
           bar_count=`expr ${bar_count} / ${BAR_BS}`
       fi

       # Compute block size for given count:
       bar_wc=`expr ${BAR_WIDTH} '*' ${bar_count}`

       bar_bs=`expr ${bar_size} + ${bar_wc}`
       bar_bs=`expr ${bar_bs} - 1`
       bar_bs=`expr ${bar_bs} / ${bar_wc}`

       # Compute bs * count, the bytes per step:
       bar_bps=`expr ${bar_bs} '*' ${bar_count}`

       # Compute bytes per hundredth:
       bar_bph=`expr ${bar_size} + 99`
       bar_bph=`expr ${bar_bph} / 100`


       # Run loop:
       bar_pos=0
       bar_graph="${BAR_L}"
       bar_cur_char=0
       bar_t0=`eval "${BAR_GET_TIME}" 2>/dev/null` || bar_t0=0
       for bar_file
       do
           # BEGIN TRACE
           if test "x${BAR_TRACE}" = x1
           then
               bar_trace=`expr "${bar_file}" : '.*/\([^/][^/]*\)$'` || bar_trace="${bar_file}"
               bar_trace=`expr "${bar_trace}${bar_t_space}" : '\('${bar_t_dot}'\)'`
               bar_trace="${bar_trace} "
           fi
           # END TRACE
           # Initial character position in bar for file:
           bar_char=`expr ${bar_pos} / ${bar_want_bps}` || bar_char=0
           while test "${bar_char}" -gt `expr ${bar_cur_char} + 4`
           do
               bar_graph="${bar_graph}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}"
               bar_cur_char=`expr ${bar_cur_char} + 5`
           done
           while test "${bar_char}" -gt "${bar_cur_char}"
           do
               bar_graph="${bar_graph}${BAR_C1}"
               bar_cur_char=`expr ${bar_cur_char} + 1`
           done

           # Get file size.  This must work now (we checked with test -f before).
           bar_size1=`eval "${BAR_GET_SIZE}" 2>/dev/null` || bar_size1=0

           # BEGIN LARGE
           # Divide and upround by pattern matching:
           if test -n "${bar_div}"
           then
               bar_size1=`expr "${bar_size1}" : '\(.*\)'${bar_div}'$'` || bar_size1=0
               bar_size1=`expr "${bar_size1}" + 1`
           fi
           # END LARGE

           # loop:
           bar_total=0
           (
               exec 6>&1
               exec 5<"${BAR_DIR}${bar_file}${BAR_EXT}"
               while test "${bar_total}" -lt "${bar_size1}"
               do
                   dd bs="${bar_bs}" count="${bar_count}${bar_numsuff}" <&5 >&6 2>/dev/null
                   bar_total=`expr ${bar_total} + ${bar_bps}`
                   if test "${bar_total}" -gt "${bar_size1}"
                   then
                       bar_total="${bar_size1}"
                   fi
                   bar_pos1=`expr ${bar_pos} + ${bar_total}`
                   bar_proz=`expr ${bar_pos1} / ${bar_bph}` || bar_proz=0
                   # BEGIN PERC
                   if test "x${BAR_PERC}" = x1
                   then
                       bar_perc="  ${bar_proz}% "
                       bar_perc=`expr "${bar_perc}" : '.*\(.....\)$'`
                   fi
                   # END PERC
                   # BEGIN ETA
                   if test "x${BAR_ETA}" = x1
                   then
                       bar_diff=`eval "${BAR_GET_TIME}" 2>/dev/null` || bar_diff=0
                       bar_diff=`expr ${bar_diff} - ${bar_t0} 2>/dev/null` || bar_diff=0
                       bar_100p=`expr 100 - ${bar_proz}` || bar_100p=0
                       bar_diff=`expr ${bar_diff} '*' ${bar_100p}` || bar_diff=0
                       bar_diff=`expr ${bar_diff} + ${bar_proz}` || bar_diff=0
                       bar_diff=`expr ${bar_diff} - 1` || bar_diff=0
                       bar_diff=`expr ${bar_diff} / ${bar_proz} 2>/dev/null` || bar_diff=0
                       if test "${bar_diff}" -gt 0
                       then
                           bar_t_unit=":"
                           if test "${bar_diff}" -gt 2700
                           then
                               bar_t_uni="h"
                               bar_diff=`expr ${bar_diff} / 60`
                           fi
                           bar_diff_h=`expr ${bar_diff} / 60` || bar_diff_h=0
                           if test "${bar_diff_h}" -gt 99
                           then
                               bar_eta="     ${bar_diff_h}${bar_t_unit} "
                           else
                               bar_diff_hi=`expr ${bar_diff_h} '*' 60` || bar_diff_hi=0
                               bar_diff=`expr ${bar_diff} - ${bar_diff_hi}` || bar_diff=0
                               bar_diff=`expr "00${bar_diff}" : '.*\(..\)$'`
                               bar_eta="     ${bar_diff_h}${bar_t_unit}${bar_diff} "
                           fi
                           bar_eta=`expr "${bar_eta}" : '.*\(......\)$'`
                       fi
                   fi
                   # END ETA

                   bar_char=`expr ${bar_pos1} / ${bar_want_bps}` || bar_char=0
                   while test "${bar_char}" -gt "${bar_cur_char}"
                   do
                       bar_graph="${bar_graph}${BAR_C1}"
                       ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${bar_graph}${BAR_E_C2}" 1>&2
                       bar_cur_char=`expr ${bar_cur_char} + 1`
                   done
               done
           ) | eval "${BAR_CMD}"
           bar_pos=`expr ${bar_pos} + ${bar_size1}`
       done
       # ${BAR_ECHO} "${BAR_E_C1}" "${BAR_R}${BAR_E_C2}" 1>&2
   fi

   if test "${bar_shown}" = 1
   then
       # BEGIN TRACE
       test "x${BAR_TRACE}" = x1 && bar_trace="${bar_t_space} "
       # END TRACE
       # BEGIN ETA
       test "x${BAR_ETA}" = x1   && bar_eta='      '
       # END ETA
       if test "x${BAR_CLEAR}" = x1
       then
           # BEGIN PERC
           test "x${BAR_PERC}" = x1 && bar_perc='     '
           # END PERC
          bar_lauf=0
           bar_graph=''
           while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
           do
               bar_graph="${bar_graph}     "
               bar_lauf=`expr ${bar_lauf} + 5`
           done
           while test "${bar_lauf}" -lt "${BAR_WIDTH}"
           do
               bar_graph="${bar_graph} "
               bar_lauf=`expr ${bar_lauf} + 1`
           done
           ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc} ${bar_graph}
${BAR_E_C2}" 1>&2
       else
           # BEGIN PERC
           test "x${BAR_PERC}" = x1 && bar_perc='100% '
           # END PERC
           bar_lauf=0
           bar_graph=''
           while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
           do
               bar_graph="${bar_graph}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}"
               bar_lauf=`expr ${bar_lauf} + 5`
           done
           while test "${bar_lauf}" -lt "${BAR_WIDTH}"
           do
               bar_graph="${bar_graph}${BAR_C1}"
               bar_lauf=`expr ${bar_lauf} + 1`
           done
           ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${BAR_L}${bar_graph}${BAR_R}${BAR_E_C2}" 1>&2
           ${BAR_E_NL} 1>&2
       fi
   fi
}
####>-SCHNAPP-<########################################################


BAR_AWK_0=''
# Command line interface:
while test -n "$1"
do
   case "$1" in
       -o|-c|-w|-0|-1|-e|-d|-b|-s|-\[\]|-\[|-\]|-T)
           if test -z "$2"
           then
               echo "$0: Error: A non-empty argument was expected after $1" 1>&2
           fi
           BAR_ARG="$1"
           BAR_OPT="$2"
           shift
           shift
       ;;
       -o*|-c*|-w*|-0*|-1*|-e*|-d*|-b*|-T*)
           BAR_ARG=`expr "$1" : '\(-.\)'`
           BAR_OPT=`expr "$1" : '-.\(.*\)$'`
           shift
       ;;
       -h|-n|-p|-D|-D-|-q|-V|-t|-E|-L)
           BAR_ARG="$1"
           BAR_OPT=""
           shift
       ;;
       --) shift
           break
       ;;
       -*) echo "$0: Error: Unrecognized option: $1" 1>&2
           exit 1
       ;;
       *)
           break
       ;;
   esac

   case "${BAR_ARG}" in
       -h)  echo 'Usage: bar [-n] [-p] [-q] [-o FILE] [-c CMD] [-s SIZE] [-b SIZE]'
            echo '           [-w WIDTH] [-0/1/[/] CHAR] [-d DIR] [-e EXT] [Files]'
            echo '       bar -V'
            echo '       bar -D'
            echo '       bar -D-'
            echo 'Options:'
            echo '     -h         displays help'
            echo '     -o FILE    sets output file'
            echo '     -c CMD     sets individual execution command'
            echo '     -e EXT     append an extension to each file'
            echo '     -d DIR     prepend this prefix to each file (a directory must end in /)'
            echo '     -s SIZE    expected number of bytes.  Use for pipes.  This is a hint'
            echo '                only that must be greater or equal to the amount actually'
            echo '                processed.  Further, this only works for single files.'
            echo '     -b SIZE    maximal block size (bytes) (default: 1048567)'
            echo '     -w WIDTH   width in characters        (default: terminal width-3 or 76)'
            echo '     -0 CHAR    character for empty bar    (default: .)'
            echo '     -1 CHAR    character for full bar     (default: =)'
            echo '     -[ CHAR    first character of bar     (default: [)'
            echo '     -] CHAR    last  character of bar     (default: ])'
            echo '     -n         clears bar after termination'
            echo '     -t         traces (=displays) which file is processed'
            echo '     -T WIDTH   no of characters reserved for the file display of -t'
            echo '     -p         hides percentage'
            echo '     -E         hides estimated time display'
            echo '     -q         hides the whole bar, be quiet'
            echo '     -D         tries to dump the bar_cat() shell function, then exit.'
            echo '                Here, -t, -p, -E remove the corresponding feature completely.'
            echo '                Further, -L removes large file support from the code.'
            echo '     -D-        same as -D, but dumps the function body only'
            echo '     -V         displays version number'
            echo '     --         end of options: only file names follow'
            exit 0
       ;;
       -n)  BAR_CLEAR=1
       ;;
       -L)  BAR_LARGE=0
            BAR_AWK_0="${BAR_AWK_0} /END  *LARGE/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN  *LARGE/ {x=0} ;"
       ;;
       -t)  BAR_TRACE=1
            BAR_AWK_0="${BAR_AWK_0} /END  *TRACE/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN  *TRACE/ {x=0} ;"
       ;;
       -T)  BAR_TRACE_WIDTH="${BAR_OPT}"
       ;;
       -q)  BAR_OK=0
       ;;
       -p)  BAR_PERC=0
            BAR_AWK_0="${BAR_AWK_0} /END  *PERC/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN  *PERC/ {x=0} ;"
       ;;
       -E)  BAR_ETA=0
            BAR_AWK_0="${BAR_AWK_0} /END  *ETA/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN  *ETA/ {x=0} ;"
       ;;
       -V)  echo "bar v${BAR_VERSION}"
            exit 0
       ;;
       -D)  echo "BAR_VERSION=${BAR_VERSION}"
            awk "${BAR_AWK_0}"'{sub(/ *#.*$/,"")} ; /^bar_cat/ {x=1} ; {sub(/^  */,"")} ; /./ {if(x)print} ; /^}/ {x=0}' "$0"
            exit 0
       ;;
       -D-) echo "BAR_VERSION=${BAR_VERSION}"
            awk "${BAR_AWK_0}"'{sub(/ *#.*$/,"")} ; /^}/ {x=0} ; {sub(/^  */,"")} ; /./ {if(x)print} ; /^{/ {x=1}' "$0"
            exit 0
       ;;
       -o)  exec 1>"${BAR_OPT}"
       ;;
       -c)  BAR_CMD="${BAR_OPT}"
       ;;
       -b)  BAR_BS="${BAR_OPT}"
            if BAR_RAW=`expr "${BAR_BS}" : '\(.*\)k$'`
            then
                BAR_BS=`expr ${BAR_RAW} '*' 1024`
            elif BAR_RAW=`expr "${BAR_BS}" : '\(.*\)M$'`
            then
                BAR_BS=`expr ${BAR_RAW} '*' 1048567`
            fi
       ;;
       -s)  BAR_SIZE="${BAR_OPT}"
            if BAR_RAW=`expr "${BAR_SIZE}" : '\(.*\)k$'`
            then
                BAR_SIZE=`expr ${BAR_RAW} '*' 1024`
            elif BAR_RAW=`expr "${BAR_SIZE}" : '\(.*\)M$'`
            then
                BAR_SIZE=`expr ${BAR_RAW} '*' 1048567`
            fi
            if test "$#" -gt 1
            then
                echo "Error: -s cannot be specified for multiple input files." 1>&2
                exit 1
            fi
       ;;   
       -e)  BAR_EXT="${BAR_OPT}"
       ;;   
       -d)  BAR_DIR="${BAR_OPT}"
       ;;   
       -0)  BAR_C0="${BAR_OPT}"
       ;;   
       -1)  BAR_C1="${BAR_OPT}"
       ;;   
       -\[) BAR_L="${BAR_OPT}"
       ;;
       -\]) BAR_R="${BAR_OPT}"
       ;;
       -\[\])
            BAR_L="${BAR_OPT}"
            BAR_R="${BAR_OPT}"
       ;;
       -w)  BAR_WIDTH="${BAR_OPT}"
       ;;
    esac
done

# Invoke main function:
if test "$#" = 0
then
    bar_cat /dev/stdin
else
    bar_cat "$@"
fi
[/code:1]
很早就知道 但是渐渐了忘记这个东西了 :(
就是没有时间看看 希望有时间看看 :-)
楼上,他的原理是什么?

我刚学linux,以前一直搞java ,上面的代码没太看懂原理。


能说一下他的原理吗?

...