但使书种多,会有岁稔时。这篇文章主要讲述处理用户输入与显示数据------------(移位shift命令行参数选项)相关的知识,希望能为你提供帮助。
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 找出选项
从表面看,命令行选项没有什么特殊之处。它们跟随在命令行中的脚本名称之后,与命令行参数一样。
【处理用户输入与显示数据------------(移位shift命令行参数选项)】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来移位。
推荐阅读
- 处理用户输入与显示数据------------(getopt命令)
- 处理用户输入与显示数据------------(参数计数获取所有数据)
- 蓝牙降噪耳机测试维度
- MySQL数据库(32)(触发器 trigger)
- 处理用户输入与显示数据------------(读取参数读取程序名称测试参数)
- spring4.1.8扩展实战之五(改变bean的定义(BeanFactoryPostProcessor接口))
- 结构化命令------------(if语句)
- Java字节流和字符流详解
- 基本脚本编译------------(重定向输入输出与数学计算)