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

指定Bash解释器的脚本中select key为何在Zsh报错?Bash下正常运行

解决Bash脚本在Zsh下运行出现bad substitution的问题

问题原因

你遇到的错误是因为直接用Zsh调用脚本(如zsh script.sh)时,Zsh会忽略脚本顶部的#!/usr/bin/env bash声明,强行用Zsh语法解析脚本。而Zsh与Bash在关联数组遍历、部分语法细节上存在差异,导致解析失败。

解决方案

1. 按Shebang指定的Shell执行(推荐)

给脚本添加执行权限后直接运行,系统会自动读取Shebang调用Bash执行:

chmod +x your_script.sh
./your_script.sh

2. 手动指定Bash执行

如果不想添加执行权限,直接用Bash命令调用脚本:

bash your_script.sh

3. 修改脚本适配Zsh(如需在Zsh环境运行)

如果必须用Zsh运行脚本,调整语法兼容Zsh规则:

#!/usr/bin/env zsh

# Zsh关联数组声明(typeset -A与declare -A等效)
typeset -A DIRS=(
  project1 "$HOME/projects/project1"
  project2 "$HOME/projects/project2"
  project3 "$HOME/projects/project3"
)

PS3="Please enter your choice (1-${#DIRS[@]}): "

echo "Select a directory to navigate in tmux:"
select key in "${(@k)DIRS}"; do  # Zsh用${(@k)数组名}获取所有键
  if [[ -n "$key" ]]; then
    DIR=${DIRS[$key]}
    echo "Navigating to: $DIR"
    break
  else
    echo "Invalid selection. Please try again."
  fi
done

cd "$DIR"
  • 关键差异:Zsh中获取关联数组所有键的语法是${(@k)array},而Bash用${!array[@]};Zsh关联数组的键名可以省略引号包裹。

内容的提问来源于stack exchange,提问作者Jeff Favret

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:51:04