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

在Fish Shell中运行Bash脚本为何无法解析{1..5}范围扩展?

问题原因与解决办法

问题原因

大括号扩展(比如{1..5})是由调用脚本的当前Shell负责处理的,而非脚本内部的Bash。Fish Shell不支持{x..y}这种范围扩展语法,所以它不会把{1..5}拆解成1、2、3、4、5这五个独立参数,而是直接把整个字符串{1..5}作为单个参数传递给你的Bash脚本。

脚本里的for i in $*会遍历这个唯一的参数,最终只创建一个名为chapter{1..5}的目录。

解决办法

方法1:在Fish中用替代方式生成参数

Fish支持通过seq命令生成连续数字序列,执行脚本时用以下写法:

create-multiple-chapters (seq 1 5)

(seq 1 5)会被Fish解析为1、2、3、4、5五个独立参数,传给脚本后就能正确创建对应目录。

方法2:修改脚本,让Bash内部处理范围参数

修改脚本,让它自己识别并展开1..5这类范围格式的参数,无需依赖调用Shell的扩展能力:

#!/bin/bash

for arg in "$@"; do
    # 判断参数是否是范围格式(包含..)
    if [[ "$arg" == *..* ]]; then
        start=${arg%%..*}
        end=${arg##*..*}
        # 展开范围并创建目录
        for i in $(seq "$start" "$end"); do
            mkdir -p "chapter$i"
            touch "chapter$i/init.adoc"
        done
    else
        # 处理单个参数
        mkdir -p "chapter$arg"
        touch "chapter$arg/init.adoc"
    fi
done

修改后在Fish中直接执行:

create-multiple-chapters 1..5
create-multiple-chapters 1 2 5

都能正确生成对应目录。

方法3:让Bash负责扩展参数

如果一定要用{1..5}的写法,可以在Fish中调用Bash来完成扩展,再传递给脚本:

bash -c 'create-multiple-chapters {1..5}'

这里Bash会先把{1..5}展开成五个参数,再执行脚本。

额外提示

脚本里的$*建议替换为"$@",后者能正确保留带空格的参数(比如如果参数是"hello world","$@"会把它作为单个参数处理,而$*会拆成两个),让脚本更健壮。

内容的提问来源于stack exchange,提问作者Ahmad Ismail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:20:11