如何使 select 操作符在 zsh 中类似于 bash 的行为

3

我正在尝试在zsh中使用下面的代码:

select var in $list; do
  if [ x"$var" != x"" ]; then
    echo $var
    return
  fi
done

在bash中,结果会像这样:
  1. 第一
  2. 第二
  3. 第三
但在zsh中,结果是这样的:
  1. 第一          3. 第三
  2. 第二
如何使它在新行上打印每个变量?

2
使用 zsh,您无需使用古老的技巧来防止空字符串。只需使用 if [[ -n $var ]] - undefined
[[ -n ]]仍然格式错误,以防有人使用预处理语句。Zsh将其表述为“未知条件:-n”,而不是报告缺少的参数,并提供默认值[[ -n ]] == [[ -n "" ]]或等效的零元[[ -n ]] == false。如果其中任何一项发生变化,可能意味着又要添加一个环境变量来在严格/方便/兼容/可移植之间切换。(因此称为“古老的黑客”-遗留代码繁琐但有时更具可移植性,等等,因为shell的差异。这并不是为了辩护,只是我知道Zsh的特性和怪癖意味着我在Bash中会遇到一些问题。) - undefined
1个回答

4

来自Zsh手册:

 COLUMNS <S>
     The number of columns for this terminal session.  
     Used for printing select lists and for the line editor.

这里可以正常运行:

emulate -L zsh
setopt sh_word_split
# if not running in a separate shell, you'll want to restore the old value
export COLUMNS=1
list="first second third"
select var in $list; do
  if [ x"$var" != x"" ]; then
    echo $var
  return
  fi
done

如果在您的主交互式shell上运行,请恢复COLUMNS的旧值。


x"" 语法是什么?我很难找到相关信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接