You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:49