读取命令行参数
获取参数:
在脚本中使用 $1,$2,$3,直到,$9 来读取命令行参数,从第十位参数开始必须在数字上加花括号 ${10},${11} 等等,$0 为脚本名称。参数之间用空格分格,参数可以是数字、英文,如果有空格需要双引号或单引号包括起来。
例:echo $1 $2 $3 $4 $5
./demo.sh 1 2 3 4 "hello world" 输入参数的格式
读取脚本名:name=$( basename $0 )
获取到脚本名称,用 $0 读取脚本名时要注意,这里的名称会包含路径名称,所以使用basename命令来获取脚本名称。
注意:如果是通过软连接执行这个脚本,$0 获取到的是这个软连接的名称
特殊参数变量:
$# 表示参数的总个数
${!#} 表示最后一个参数,${$#} 这样的方式不正确,要把括号中的美元符号换成感叹号
注意:当参数总个数为0时,$# 也为 0 ,${!#} 则返回脚本名,相当于$0
抓取所有数据:
$* 会将所有命令行参数当成一个整体,for命令遍历时也只当成一个参数
$@ 将命令行的每一个参数试做单独的,for命令遍历时可以遍历出每个参数
shift命令移动参数:shift n
会删除命令行的前n个参数,后面的参数会补上来$2作为$1,$3作为$2,不加参数n只移动一个,$0 不会变,只从 $1 开始移动。
例:while [ -n "$1" ]
do
echo "$1"
shift
done
这样就可以将所有参数输出
选项和参数的基本处理:while [ -n "$1" ]
do
case "$1" in
-b ) echo "option -b";;
-c ) param=$2 ; shift ;echo "option -c parameter $param";;
* ) echo "$1 is not option";;
esac
shift
done
./demo.sh -c test -b -a 选项-c后面的参数会被$2接收到,并用shift删掉,顺序没有影响
使用getopt命令处理选项和参数
getopt命令是将输入的选项和参数格式化成“-a value -b value -- value1 value2”的形式,也就是一个选项一个参数的形式,符号 -- 后面的是多余的参数。
如在脚本中写入如下内容,脚本的名称为 demo.shgetopt a:b:c "$@"
运行这个脚本:./demo.sh -a aaa ddd -b bbb ccc
处理结果为:-a aaa -b bbb -- ddd ccc
一个选择一个参数,选项后面多余的参数会被放到 -- 后面。
也可以直接在后面输入选项:getopt a:bcd: -a "one" -b -c -d "two"
其中abcd为需要的选项,a和d后面的冒号表示a和d后面需要参数。如果给了多余的选项或者参数会有错误提示信息,用-q可以消除错误提示。
-q 取消错误提示set -- $( getopt -q a:bcd: "$@" )
set命令的双破折线“--”选项可以将命令行参数替换成set命令的命令值。
例:set -- $( getopt -q a:b "$@" )
while [ -n "$1" ]
do
case "$1" in
-a ) echo "The option is $1 parameter is $2" ; shift ;;
-b ) echo "The option is $1" ;;
-- ) shift ; break ;; #这里的shift是为了循环下面的程序可以继续从$1开始读参数,如果没有就不用了。
* ) echo "$1 is not option" ;;
shift
done
for param in "$@"
do
echo "The parameter is $1";
done
注意:getopt命令不能处理带空格的参数,如"hello world"是不行的。
getopts处理参数
getopts optstring variable
与getopt不同的是getopts会逐个处理参数,取消报错只要在optstring之前加上一个冒号即可,字母后加冒号表示该选项有参数,OPTARG环境变量会保存每次要处理的参数,OPTIND 环境变量会保存正在处理参数的位置。
OPTARG 当前要处理的参数 option argument
OPTIND 当前参数的位置 option index
例:第一个冒号表示忽略错误while getopts :ab:c opt
do
case "$opt" in
a)
echo "The option is -a Ind is $OPTIND";;
b)
echo "The option is -b parameter is $OPTARG Ind is $OPTIND";;
c)
echo "The option is -c Ind is $OPTIND";;
*)
echo "Unknown option $opt";;
esac
done
shift $[ $OPTIND - 1 ] #$OPTIND - 1 正好是在getopts中已近定义了的参数长度,把已近定义了的移除掉剩下来的就是多余出来的参数,留给下面程序处理。
for param in "$@"
do
echo "$param"
done
./demo.sh -ab test0 -c test1 test2 test3
注意:getopts可以处理带空格的参数如"hello world",未定义的选项会输出成问号“?”。
常见的linux命令选项:
-a 显示所有对象 --all
-c 生成一个计数 --count
-d 指定一个目录 --directory
-e 扩展一个对象 --extend
-f 指定读入数据的文件 --file
-h 显示帮助信息 --help
-i 忽略文本大小写 --ignore
-l 产生输出的长格式 --long
-n 使用非交互模式,批处理 --non
-o 指定输出文件 --output
-q 以安静模式运行 --quiet
-r 递归处理 --recursion
-s 以安静模式运行 --silence
-v 生成详细输出 --view
-x 排除某个对象 --exclude
-y 对所以问题回答yes --yes