可选地传递标志时出现未知的长标志错误

Getting unknown long flag error while passing flags optionally

我正在尝试根据条件和环境变量选择性地添加标志。我参考了 here。 我已经执行了这样的命令 -

export DOWN_MIGRATE=true
export NO_OF_DOWN_MIGRATIONS="2"
./scripts abc.sh ${DOWN_MIGRATE:+--migrate-only down $NO_OF_DOWN_MIGRATIONS}

但它抛出以下错误:

main: error: unknown long flag '--migrate-only down 2'
exit status 1

以下命令工作正常:

./scripts abc.sh --migrate-only down 2

如何解决这个问题?

zsh 与大多数 Bourne-ish shell 有许多显着差异。您是 运行 最大的区别之一:默认情况下,它不会将变量扩展的结果拆分为单独的“单词”。在这种情况下,这意味着 ${DOWN_MIGRATE:+--migrate-only down $NO_OF_DOWN_MIGRATIONS} 的扩展作为单个长参数传递,而不是分成三个词(“--migrate-only”、“down”和“2").单个长参数混淆了脚本。

你可以告诉 zsh 你想要通过在扩展中添加 the = modifier 来完成分词:

./scripts abc.sh ${=DOWN_MIGRATE:+--migrate-only down $NO_OF_DOWN_MIGRATIONS}

请注意,如果 $NO_OF_DOWN_MIGRATIONS 扩展为多个单词,那也会被拆分。如果你想避免这种可能性(但保留“--migrate-only”和“down”的拆分),你可以只用双引号引用那部分:

./scripts abc.sh ${=DOWN_MIGRATE:+--migrate-only down "$NO_OF_DOWN_MIGRATIONS"}

任何时候你获取用于 bash 或其他 POSIX shell 的代码样本并将它们放入 zsh 脚本中时,你需要知道 zsh 可能做的事情与代码假设的不同。