您的位置:首页 > 其它

第4章 处理用户输入与显示数据------------(移位shift、命令行参数选项)

2017-04-22 00:00 489 查看

4.2移位与选项

bashshell工具集中的另一个工具是shift命令。bash shell提供shift命令来帮助操作命令行参数。shift命令能够改变命令行参数的相对位置。

选项是由破折号引导的单个字母,它更改命令的行为。

4.2.1 移位

使用shift命令时,默认将每个参数变量左移一个位置。于是,变量$3的值移给变量$2,变量$2的值移位给变量$1,而变量$1的值被丢弃(注意变量$0的值和程序名称都保持不变)。

这是迭代命令行参数的另一个好方法,尤其在不清楚参数数目的情况下。可以先对第一个参数进行操作,然后对参数进行一次左移,再对第一个参数进行操作

#!/bin/bash
#使用shift对命令行参数进行左移
count=1
while [ -n "$1" ]
do
echo "命令行参数 #$count=$1"
count=$[ $count+1 ]
#所有命令行参数值左移一位
shift
done




当然,可以通过为shift命令提供一个参数来实行多位移变化。提供需要移动的位置数目即可。通过在shift命令中设置值,可以很容易的跳过不需要的参数。使用shift命令时要谨慎,将某一位参数移位掉后,该参数值就丢失了,不能恢复

移位操作实例如下:

#!/bin/bash
#使用shift n对命令行参数进行左移
count=1
#判断命令行参数个数大于2
while [ $# -gt 1 ]
do
echo "输出命令行参数 #$count=$1"
count=$[ $count+1 ]
#所有命令行参数值左移2位
shift 2
done




4.2.2 找出选项

从表面看,命令行选项没有什么特殊之处。它们跟随在命令行中的脚本名称之后,与命令行参数一样。

1.处理简单选项

可以使用shift方法处理命令行选项。在抽取每个参数时,使用case语句判断参数是否符合选项格式。case语句检查每个参数是否为有效的选项。当找到一个选项时,就在case语句中运行适当的命令。无论选项在命令行中以什么顺序出现,这种方法都有效。

case语句在命令行参数中每找出一个选项,就会对选项进行处理。如果命令行中包含其他参数,可以在case语句的catch-all部分包含处理它们的命令。

#!/bin/bash
echo "处理简单的命令行参数"
#依次在屏幕上打印选项,直至命令行参数输出完!
while [ -n "$1" ]
do
case "$1" in
-h) echo "Found the -h options";;
-l) echo "Found the -l options";;
-a) echo "Found the -a options";;
-t) echo "Found the -t options";;
*) echo "Print $1";;
esac
#所有命令行参数值左移一位
shift
done




2.从参数中分离选项

执行shell脚本时经常会遇到即需要使用选项又需要使用参数的情况。在linux中的表中方式是通过特殊字符码将二者分开,这个特殊字符码告诉脚本选项结束和普通参数开始位置。

对于Linux,这个特殊字符是双破折号(--)。shell使用双破折号指示选项列表的结束。发现双破折号后,脚本就能够安全的将剩余的命令行参数作为参数而不是选项处理。

操作实例如下:

#!/bin/bash
echo "从参数中分离选项"
#依次在屏幕上打印选项,直至命令行参数输出完!
while [ -n "$1" ]
do
case "$1" in
-h) echo "Found the -h options";;
-l) echo "Found the -l options";;
-a) echo "Found the -a options";;
-t) echo "Found the -t options";;
--) shift
break;;
*) echo "$1 is not options";;
esac
#所有命令行参数值左移一位
shift
done

echo "输出选项参数"
count=1
for para in $@
do
echo "参数#$1:$para"
count=$[ $count+1 ]
done




这个脚本使用break命令使得遇到双破折号时从while循环中跳出。因为提前从循环中跳出,所以需要保证加入一个shift命令将双破折号从参数变量中丢弃。第一次测试,尝试使用普通选项和参数集运行脚本,结果显示脚本将所有命令行参数作为选项处理。接下来,再进行一次测试,但此次使用双破折号将命令行中选项和参数分开。当脚本到达双破折号时,停止处理选项,并将其余的参数视为命令行参数。

3.处理带值的选项

有些选项需要附加的参数值。这种情况下,命令行形式与下面的格式类似:



要求脚本必须能够监测命令行选项何时需要附加参数,并能够正确进行处理。

#!/bin/bash
echo "从参数中分离选项"
#依次在屏幕上打印选项,直至命令行参数输出完!
while [ -n "$1" ]
do
case "$1" in
-h) echo "Found the -h options";;
-l) para="$2"
echo "Found the -l options,with the parameter value $para"
shift;;
-a) echo "Found the -a options";;
-t) para=$2
echo "Found the -t options,with the parameter value $para"
shift;;
--) shift
break;;
*) echo "$1 is not options";;
esac
#所有命令行参数值左移一位
shift
done

echo "输出选项参数"
count=1
for para in $@
do
echo "参数#$1:$para"
count=$[ $count+1 ]
done




case语句定义了4个选项的处理。其中-l、-t选项需要附加参数值。由于处理参数是$1,所以知道附件参数值位于$2中。由于从变量$2中抽取参数值。当然这个选项占用两个参数位置,需要设置shift来移位
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐