如何使用Shell的shift命令编写脚本输出ls的前12个命令行参数?
别担心,我来帮你把shift命令的原理讲透,再给你写个能完成需求的脚本,顺便解决你遇到的无限循环问题~
先搞懂shift到底是干啥的
shift是Shell的内置命令,作用很简单:把脚本的位置参数(就是$1、$2、$3这些)整体向左“挪”一位。举个例子:
- 假设脚本启动时接收到的参数是
a b c d,此时$1=a、$2=b、$3=c、$4=d - 执行一次
shift后,参数变成b c d,此时$1=b、$2=c、$3=d,原来的$1(也就是a)直接被丢弃了 - 如果写
shift 2,就是一次性左移2位,上面的例子执行后参数会变成c d,$1=c
你之前陷入无限循环,大概率是没给循环加终止条件——要么没限制只输出12个,要么没检查参数是否已经被shift完了(当$1为空时还继续循环)。
能完成需求的脚本示例
下面这个脚本会接收参数,然后输出前12个(如果参数不足12个,就输出所有参数):
#!/bin/bash # 初始化计数器,记录已经输出的参数数量 count=0 # 循环终止条件:要么已经输出12个,要么参数已经用完 while [ $count -lt 12 ] && [ -n "$1" ]; do # 输出当前第一个参数 echo "$1" # 计数器加1 ((count++)) # 左移参数,让下一个参数变成新的$1 shift done
怎么用这个脚本输出ls的前12个结果?
你只需要把ls的输出作为参数传给脚本就行,比如:
./your_script.sh $(ls)
$(ls)会把当前目录的文件列表拆成一个个参数传给脚本,脚本就会输出前12个。
更简洁的写法(用for循环)
如果喜欢更紧凑的代码,也可以用for循环来控制次数:
#!/bin/bash # 循环12次,同时检查是否还有参数 for ((i=0; i<12 && [ -n "$1" ]; i++)); do echo "$1" shift done
为什么之前会无限循环?
举个反例,如果你之前写的是这种没有终止条件的循环:
# 错误示例!会无限循环 while true; do echo "$1" shift done
当所有参数都被shift完之后,$1会变成空字符串,这个循环还会一直跑,每次输出空行,就成了无限循环。而我们上面的脚本加了$count -lt 12和[ -n "$1" ]两个条件,就能完美避免这个问题。
内容的提问来源于stack exchange,提问作者Panda King Beersy
相关产品推荐
相关产品推荐

