运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解
运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客
运维Shell脚本小试牛刀(七):从函数文件中调用另外一个脚本文件中函数
运维Shell脚本小试牛刀(八): case模式忽略命令行参数大小写演示
运维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
doneecho "====================================================================第一个while循环结束================================================================="
# while循环退出的条件改为$1的值不为空;
while [ -n "$1" ]
do
# 打印特殊变量$1的值及特殊变量$#的值
echo "Current Parameter: $1, Remaining $#."# 将$1的值传递给函数或者其它操作
# Pass $1 to some bash function or do whatever# 将位置参数左移一位
shiftdone
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
doneecho "====================================================================第一个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循环结束=================================================================
==========================================循环已终止====================================================================================================