当前位置: 首页 > Linux

bash小技巧:使用shift内置命令将前几个命令参数左移

时间:2023-04-06 22:08:56 Linux

在bash中,可以使用位置参数(positionalparameters)来获取传入脚本或传入函数的每个参数的值。比如$1对应传入的第一个参数,$2对应传入的第二个参数。以此类推。我们可以使用内置的shift来重命名位置参数。比如执行shift1命令后,$1会对应传入的第二个参数,$2会对应传入的第三个参数。以此类推。查看manbash对shift命令的描述如下:shift[n]Thepositionalparametersfromn+1...arerenamedto$1....numbers$#downto$#-n+1areunset.n必须是小于或等于$#的非负数。如果n为0,则不更改任何参数。如果未给出n,则假定为1。如果n大于$#,则不更改位置参数。如果n大于$#或小于零,则返回状态大于零;否则为0。即shift命令根据给定的n参数值重命名位置参数。将$1重命名为$n+1。将$2重命名为$n+2。同样的方法可以推导出下面的参数。类似于将n个位置参数向左移动。如果不提供n参数,则默认值为1。给定的n必须是大于等于0的整数。由于shift命令的参数不能为负数,执行该命令后要重命名位置参数,该命令不能用于恢复原来的位置参数。执行完shift命令后,$#的值会更新为剩余的参数个数,而$@只会得到剩余的参数列表。当需要将某个参数传入脚本后的所有参数传递给脚本函数时,可以使用shift命令重命名位置参数,方便引用。下面以一个testshift.sh脚本来说明该命令的用法。脚本内容如下:#!/bin/bashreverse=0functionprint_params(){localstring="$@"if[$reverse-eq1];然后echo$string|revelseecho$stringfi}whilegetopts"r"opt;docase$optinr)reverse=1;;esacdoneshift$((OPTIND-1))print_params"$@"这个脚本可以接受一个-r选项,如果提供这个选项,使用rev命令以相反的顺序输出给定的字符串参数。如果未提供此选项,则以正常顺序输出给定的字符串参数。getopts命令处理选项参数时,OPTIND全局变量会加上选项参数的个数,其值从1开始。$((OPTIND-1))表达式可以用来获取所有选项的个数提供的论据。例如,执行./testshift.sh-r命令并提供-r选项参数。getopts处理完这个option参数后,OPTIND的值为2,减1就是option参数个数。使用shift$((OPTIND-1))命令跳过给定的option参数,然后使用$@获取不包含option参数的参数列表。这些选项参数不需要传递给print_params函数。如果这里不使用shift命令,直接写成print_params"$@"语句,那么print_params函数会收到传入的-r选项,$1就是-r选项。那么函数需要对这个选项做特殊处理,代码不够简洁。即如果想跳过命令行参数的前几个参数,将后面的参数全部传递给其他地方使用,使用shift命令是非常方便的。否则需要遍历命令行参数获取后面的所有参数值,单独保存,再传递下去,比较麻烦。执行testshift.sh脚本,结果如??下:$./testshift.sh客商天然居上大佛寺非凡人可以看到./testshift.sh-r客商天然居人国大佛寺命令提供了-r选项,将以相反的顺序打印给定的字符串参数。由于使用shift命令,这个-r选项没有传递给print_params函数,打印出来的内容不包含这个选项。