运维Shell脚本小试牛刀(十):shift内置命令读取多个命令行参数


运维Shell脚本小试牛刀(一)

运维Shell脚本小试牛刀(二)

运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解

运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客

Cenos7安装小火车程序动画

运维Shell脚本小试牛刀(五):until循环

运维Shell脚本小试牛刀(六): Shell中的函数认知

运维Shell脚本小试牛刀(七):从函数文件中调用另外一个脚本文件中函数

运维Shell脚本小试牛刀(八): case模式忽略命令行参数大小写演示

运维Shell脚本牛刀小试(九): 重定向操作符“>“及双重定向“>>“

 运维Shell脚本小试牛刀(十)

运维Shell牛刀小试(十一):for循环读取多个命令行参数 


一: 读取位置参数

使用shift [n] ,可以读取多个位置参数;单个命令行参数使用case比较方便;但是多个命令行参数不太合理,使用命令shift命令在变量中一个接一个地获取命令行参数,shift时Bash内置的命令,此命令用于将传递的参数变量向左移,其语法: shift [n]; n是一个小于或等"$#"的非负数整数。如果为0,位置参数将不会改变; 如果没有指定,那么它将被默认设置为1。 如果n大于$# ,位置参数不会改变, 如果n大于$#或者小于0,此状态的状态码将大于0,否则为0;


[root@www standandinout]# cat shiftreadparam.sh 
#!/bin/bash -
#==================================================================================================================
#
#
#                           FILE:  shiftreadparam.sh
#                           USAGE: ./shiftreadparam.sh
#    DESCRIPTION: 读取位置参数:使用shift [n] ,可以读取多个位置参数;单个命令行参数使用case比较方便;但是多个命令行参数不太合理,使用命令shift命令在变量中一个接一个地获取命令行参数,
#                 shift时Bash内置的命令,此命令用于将传递的参数变量向左移,其语法: shift [n]; n是一个小于或等"$#"的非负数整数。如果为0,位置参数将不会改变;
#                 如果没有指定,那么它将被默认设置为1。 如果n大于$# ,位置参数不会改变,
#                 如果n大于$#或者小于0,此状态的状态码将大于0,否则为0;
#
#                
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================
flag=0
# 如果命令行参数的个数不为0,则继续while循环,否则退出循环
while [ $# -ne 0 ]
do
  
 # 打印特殊变量$1的值及特殊变量$#的值
 echo "Current Parameter: $1, Remaining $#."

# flag变量自加1运算
 flag=`expr $flag + 1`
 # 将$1的值传递给函数或者其它操作
 # Pass $1 to some bash function or do whatever
 # 将位置参数左移一位
 shift
 # 如果变量flag大于5则跳出循环
 if [ $flag -gt 5 ]
 then
    break
 fi
done

echo "====================================================================第一个while循环结束================================================================="

# while循环退出的条件改为$1的值不为空;

while [ -n "$1"
do
   
 # 打印特殊变量$1的值及特殊变量$#的值
 echo "Current Parameter: $1, Remaining $#."

 # 将$1的值传递给函数或者其它操作
 # Pass $1 to some bash function or do whatever

 # 将位置参数左移一位
 shift

done
echo "====================================================================第二个while循环结束================================================================="


二: 脚本测试 


[root@www standandinout]# ./shiftreadparam.sh one two three four
Current Parameter: one, Remaining 4.
Current Parameter: two, Remaining 3.
Current Parameter: three, Remaining 2.
Current Parameter: four, Remaining 1.
====================================================================第一个while循环结束=================================================================
====================================================================第二个while循环结束=================================================================
[root@www standandinout]# ./shiftreadparam.sh one two three four five
Current Parameter: one, Remaining 5.
Current Parameter: two, Remaining 4.
Current Parameter: three, Remaining 3.
Current Parameter: four, Remaining 2.
Current Parameter: five, Remaining 1.
====================================================================第一个while循环结束=================================================================
====================================================================第二个while循环结束=================================================================
[root@www standandinout]# ./shiftreadparam.sh one two three four five six
Current Parameter: one, Remaining 6.
Current Parameter: two, Remaining 5.
Current Parameter: three, Remaining 4.
Current Parameter: four, Remaining 3.
Current Parameter: five, Remaining 2.
Current Parameter: six, Remaining 1.
====================================================================第一个while循环结束=================================================================
====================================================================第二个while循环结束=================================================================
[root@www standandinout]# ./shiftreadparam.sh one two three four five six seven eight
Current Parameter: one, Remaining 8.
Current Parameter: two, Remaining 7.
Current Parameter: three, Remaining 6.
Current Parameter: four, Remaining 5.
Current Parameter: five, Remaining 4.
Current Parameter: six, Remaining 3.
====================================================================第一个while循环结束=================================================================
Current Parameter: seven, Remaining 2.
Current Parameter: eight, Remaining 1.
====================================================================第二个while循环结束=================================================================
[root@www standandinout]# ./shiftreadparam.sh one two three four five six seven eight ten 
Current Parameter: one, Remaining 9.
Current Parameter: two, Remaining 8.
Current Parameter: three, Remaining 7.
Current Parameter: four, Remaining 6.
Current Parameter: five, Remaining 5.
Current Parameter: six, Remaining 4.
====================================================================第一个while循环结束=================================================================
Current Parameter: seven, Remaining 3.
Current Parameter: eight, Remaining 2.
Current Parameter: ten, Remaining 1.
====================================================================第二个while循环结束=================================================================


引出问题: 

       如将脚本中的shift命令修改为5, 并传递系列参数,如传递的参数不能被5整除;如我们传递9个 命令行参数,将第一次执行作用$1 之后,$1的值变为了six,而$#的值变为2;在第一次移位操作后,将不再有位移被执行,并且$1的值也不为空, $#也不为0,这样就一只无限地迭代下去,为解决这一问题,可以使用shift的退出状态来解决。通过在shift命令后添加$?的值是否为0来检查shift命令是否被执行。如果$?的值为非0,那么就终止循环

三:  shift [5] 与$?结合退出循环


[root@www standandinout]# cat shift5readparam.sh 
#!/bin/bash -
#==================================================================================================================
#
#
#                           FILE:  shiftreadparam.sh
#                           USAGE: ./shiftreadparam.sh
#    DESCRIPTION: 读取位置参数:使用shift [n] ,可以读取多个位置参数;单个命令行参数使用case比较方便;但是多个命令行参数不太合理,使用命令shift命令在变量中一个接一个地获取命令行参数,
#                 shift时Bash内置的命令,此命令用于将传递的参数变量向左移,其语法: shift [n]; n是一个小于或等"$#"的非负数整数。如果为0,位置参数将不会改变;
#                 如果没有指定,那么它将被默认设置为1。 如果n大于$# ,位置参数不会改变,
#                 如果n大于$#或者小于0,此状态的状态码将大于0,否则为0;
#
#                
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================

# 如果命令行参数的个数不为0,则继续while循环,否则退出循环
while [ $# -ne 0 ]
do
  
 # 打印特殊变量$1的值及特殊变量$#的值
 echo "Current Parameter: $1, Remaining $#."
 
 # 将$1的值传递给函数或者其它操作
 # Pass $1 to some bash function or do whatever
 # 将位置参数左移一位
 shift 5
 # 如果上一条命令的返回值不为0,则执行if语句
 if [ $? -ne 0 ]
 then
   # 终止循环的执行
   break
 
 fi
 
done

echo "====================================================================第一个while循环结束================================================================="

echo "==========================================循环已终止===================================================================================================="
 

四: 测试脚本命令执行 


[root@www standandinout]# ./shift5readparam.sh one two three four five six senven
Current Parameter: one, Remaining 7.
Current Parameter: six, Remaining 2.
====================================================================第一个while循环结束=================================================================
==========================================循环已终止====================================================================================================
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值