Shell脚本中shift命令相较于直接赋值的优势及代码用法解惑
Shell脚本中
shift命令的优势及代码解析 嘿,这个问题问得相当到位!我来给你掰扯清楚shift命令对比直接重新赋值的优势,再把你贴的代码里那两处shift拆解明白。
shift命令相较于直接重新赋值的优势
- 简化参数遍历逻辑:要是你手动给参数重新赋值,比如写
$1=$2; $2=$3; ...这种,参数少还好说,参数多的时候不仅写得手酸,维护起来也头大。shift一句命令就能把所有命令行参数左移一位,自动处理后续参数的位置,逻辑清爽太多。 - 避免手动索引错误:手动赋值很容易搞混参数位置,比如漏了某个参数或者索引写错,结果就是脚本逻辑出错。
shift是Shell内置的参数处理命令,处理参数位置绝对靠谱,不会犯这种低级错误。 - 适配可变数量的参数:如果你的脚本允许用户传入数量不固定的参数,
shift配合while [[ -n $1 ]]这种循环,就能轻松遍历所有参数。手动赋值根本没法应对这种场景——总不能写一堆判断语句吧? - 代码更简洁易读:相比一堆乱糟糟的变量赋值语句,
shift的语义特别明确,看代码的人一眼就知道“哦,这是在处理命令行参数的位置偏移”,可读性直接拉满。
代码中两处shift的作用解析
先把你的代码贴出来方便对照:
#! /usr/local/bin/bash # process command line options interactive= filename= while [[ -n $1 ]]; do case $1 in -f | --file) shift #don't understand the shift #No.1 filename=$1 ;; -i | --interactive) interactive=1 ;; -h | --help) usage exit;; *) echo "usage >&2 exit 1";; esac shift # don't understand the shift #2 done #interactive mode if [[ -n $interactive ]]; then echo "do something" fi #output html page if [[ -n $filename ]]; then if touch ...
第一处shift(-f | --file分支里的)
当用户给脚本传入-f或者--file选项时,这个选项本身是一个参数(比如用户输入./yourscript.sh -f test.txt,此时$1是-f,$2是test.txt)。这里的shift就是把所有参数左移一位,让原来的$2变成新的$1,这样后面的filename=$1就能直接拿到我们需要的文件名了。要是没这个shift,filename=$1会把-f赋值给filename,完全不是我们想要的结果。
第二处shift(循环末尾的)
这个shift是用来“推进”参数处理的:处理完当前的$1参数后,执行shift让下一个参数变成新的$1,这样循环就能继续处理下一个命令行参数。比如处理完-i选项后,执行这个shift,原来的$2就变成$1,循环继续判断$1是否存在,直到所有参数都处理完毕。要是没这个shift,循环会一直盯着第一个参数不放,直接陷入死循环。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

