向脚本传递参数

  1、shift命令
#!/bin/bash
#opt2
while [ $# -ne 0 ]
do
  echo $1
done
以上脚本会导致死循环,不断打印参数$1,修改后如下:
#!/bin/bash
#opt2
while [ $# -ne 0 ]
do
  echo $1
  shift
done
就会循环将每个参数打印出来

2、获取命令行输入的最后一个参数

两种方法:eval echo \$$#或shift 'expr $# -2'

  

3、使用shift处理文件大小写转换

#!/bin/bash
#tr_case
FILES=""
TRASE=""
EXT=""
OPT=no

error_msg()
{
_FILENAME=$1
echo "`basename $0`: Error the conversion failed on $_FILENAME"
}

if [ $# -eq 0 ]
then
  echo "For more info try `basename $0`  --help"
  exit 1
fi
while [ $# -gt 0 ]
do
  case $1 in
  -u) TRCASE=upper
    EXT=".UC"
    OPT=yes
    shift
    ;;
  -l) TRCASE=lower
    EXT=".LC"
    OPT=yes
    shift
    ;;
  -help)
    echo "convert a files to uppercase from lowercase"
    echo "convert a files from lowercase to uppercase"
    echo "will convert all character according to the"
    echo "specified command option"
    echo "where option is"
    echo "-l convert to lowercase"
    echo "-u convert to uppercase"
    echo "the original file is not touched.A new file"
    echo "will be created with either a .UC or .LC extension"
    echo "usage: $0 -[l|u] file [file..]"
   exit 0
   ;;
  -*) echo "usage: `basename $0` -[l|u] file [file..]"
    exit 1
    ;;
  *) if [ -f $1 ]
     then
       FILES=$FILES" "$1
     else
       echo "`basename $0`: Error cannot find the file $1"
     fi
     shift
     ;;
  esac
  done
  if [ "$OPT" = "no" ]
  then
    echo "`basename $0`: Error you need to specify an option. no action taken"
    echo "try `basename $0` --help"
    exit 1
  fi
  for LOOP in $FILES
  do
    case $TRCASE in
    lower) cat $LOOP|tr "[a-z]" "[A-Z]" >$LOOP$EXT
    if [ $? != 0 ]
    then error_msg $LOOP
    else echo "Convert file called $LOOP$EXT"
    fi
    ;;
    upper) cat $LOOP|tr "[A-Z]" "[a-z]" >$LOOP$EXT
    if [ $? != 0 ]
    then error_msg $LOOP
    else echo "Convert file called $LOOP$EXT"
    fi
    ;;
    esac
  done

 

4、getopts的使用

格式:getopts option_string variable

#!/bin/bash
#getopt1
ALL=false
HELP=false
FILE=false
VERBOSE=false

while getopts ahfgv OPTION
do
  case $OPTION in
  a)ALL=true
   echo "ALL is $ALL"
   ;;
  h)HELP=true
   echo "HELP is $HELP"
   ;;
  f)FILE=true
   echo "FILE is $FILE"
   ;;
  v)VERBOSE=true
   echo "VERBOSE is $VERBOSE"
   ;;
  esac
done

getopts读取option_string,获知脚本中使用了有效选项,将输入选项与option_string对比,如果匹配发现,变量设置为option,未发现则能设置为?,重复处理直至输入完毕。

5、使用getopts指定变量取值

在脚本中指定命令行选项取值,如:

getopts ahfvc: OPTION

选项a、h、f、v可不加实际值传递,而选项c必须取值,为避免当c不取值时的错误提示信息不明确,格式需修改如:getopts :ahfvc: OPTION

以下脚本,当参数-c选项未取值时,就会提示错误,如下:

#!/bin/bash
#getopt2
ALL=false
HELP=false
FILE=false
VERBOSE=false
COPIES=0

while getopts ahfgvc: OPTION
do
  case $OPTION in
  a)ALL=true
    echo "ALL is $ALL"
    ;;
  h)HELP=true
    echo "HELP is $HELP"
    ;;
  f)FILE=true
    echo "FILE is $FILE"
    ;;
  v)VERBOSE=true
    echo "VERBOSE is $VERBOSE"
    ;;
  c)COPIES=$OPTARG
    echo "COPIES is $COPIES"
    ;;
  \?)echo "`basename $0` -[a h f v] -[c value] file" >&2
    ;;
  esac
done

6、访问取值方式

#!/bin/bash
#backups
QUITE=n
DEVICE=awa
LOGFILE=/tmp/logbackup
usage()
{
echo "Usage: `basename $0` -d [device] -l [logfile] -q"
exit 1
}
if [ $# = 0 ]
then
  usage
fi

while getopts :qd:l: OPTION
do
  case $OPTION in
  q)QUITE=y
    LOGIFLE=/tmp/backup.log
    ;;
  l)LOGFILE=$OPTARG
    ;;
  d)DEVICE=$OPTARG
    ;;
  \?)usage
     ;;
  esac
done
echo "you chose the following options..I can now process these"
echo "Quite=$QUITE $DEVICE $LOGFILE"

7、使用getopts处理文件大小写转换

#!/bin/bash
#tr_case2
EXT=""
TRCASE=""
FLAG=""
OPT="no"
VERBOSE="off"

while getopts :luv OPTION
do
  case $OPTION in
  l) TRCASE="lower"
     EXT=".LC"
     OPT=yes
     ;;
  u) TRCASE="upper"
     EXT=".UC"
     OPT=yes
     ;;
  v) VERBOSE=on
     ;;
  \?) echo "usage: `basename $0`: -[l|u] --v file[s]"
      exit 1 ;;
  esac
done
shift `expr $OPTION - 1`
if [ "$#" = "0" ] || [ "$OPT" = "no" ]
then
  echo "usage: `basename $0` : -[l|u] -v file[2]" >&2
  exit 1
fi
for LOOP in "$@"
do
  if [ ! -f $LOOP ]
  then
    echo "`basename $0`: Error cannot find file $LOOP" >&2
    exit 1
  fi
  echo $TRCASE $LOOP
  case $TRCASE in
  lower) if [ "VERBOSE" = "on" ]; then
           echo "doing..lower on $LOOP..newfile called $LOOP$EXT"
         fi
         cat $LOOP | tr "[A-Z]" "[a-z]" >$LOOP$EXT
         ;;
  upper) if [ "VERBOSE" = "on" ]; then
           echo "doing upper on $LOOP..newfile called $LOOP$EXT"
         fi
         cat $LOOP | tr "[a-z]" "[A-Z]" >$LOOP$EXT
         ;;
    esac
done

选项

-a

-c

-d

-e

-f

-h

-i

-l

-o

-q

-p

-v


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值