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