ZSH for循环数组变量问题

use*_*965 20 unix arrays shell for-loop zsh

我在ZSH工作,但我确信BASH指令也可能有所帮助.我需要一个for循环,通过存储在数组lw中的值,然后根据存储在数组中的名称启动一个shell脚本.

到目前为止,这是我提出的:

$lw=('plugin1' 'plugin2' 'plugin3')

for i in $lw;
  do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end;
done
Run Code Online (Sandbox Code Playgroud)

它只是给我一个错误,当运行说它找不到〜/ Library/Rogall/plugins // lw.prg,所以它似乎只是忽略了我的变量all togethor.

我搞砸了的任何想法?

Jan*_*ger 38

它实际上比这简单得多:

lw=('plugin1' 'plugin2' 'plugin3')

for i in $lw; do
  . ~/Library/Rogall/plugins/$i/lw.prg end
done
Run Code Online (Sandbox Code Playgroud)

综上所述:

  • 分配给"foo",而不是"$ foo"(shell会尝试扩展$ foo并分配给它扩展到的任何内容;通常没有用)
  • 直接使用循环变量; 它包含数组而不是索引

  • 不是在一般情况下,`for $ in $ array`会跳过空元素.你需要`for $ in"$ array [@]"`或`for i in in"$ {(@)array}"`来保留空的(或者ksh/bash兼容的语法:`for i in "$ {阵列[@]}"`). (3认同)

Wil*_*ell 19

为什么要使用这个阵列呢?这可以很容易地在便携式中完成:

lw='plugin1 plugin2 plugin3'

for i in $lw;
  do . ~/Library/Rogall/plugins/$i/lw.prg end
done
Run Code Online (Sandbox Code Playgroud)

请注意,要使其在zsh中工作,您需要使zsh做正确的事情: set -o shwordsplit

  • 如果它依赖于在上下文可能是.zshrc文件时更改ZSH默认值,则它不可移植.数组是更好的解决方案. (6认同)
  • 并非一切都是为了尽可能便携,特别是如果它要在 Mac 上运行(根据目录名称判断)。对于每个单词中可能有空格的一般情况,您的解决方案也失败了。 (2认同)
  • 你怎么知道插件目录不包含空格?原始帖子中提供的名称非常通用,可以安全地假设它们不是实际名称.Jan的解决方案将在zsh上运行,具有某些设置.即使不是,它也可以通过两个微不足道的变化来实现.您的解决方案不能轻松用于空白区域.但是,诸如"文件名中的空格是令人厌恶的"之类的东西是如此令人难以置信的辩论,它甚至都不好笑.但是,让我们停在这里并同意不同意. (2认同)

the*_*sti 11

我遇到了一个问题,像这样的循环

for i in (1 2 3 4); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

多次没有按照我想要的方式工作。我会得到像这样的错误zsh: unknown file attribute: 1,或者像这样的输出

1 2 3 4
Run Code Online (Sandbox Code Playgroud)

不管我如何重新扭曲它,而不是我想要的

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

为了获得我想要的行为,我必须in从循环定义中删除关键字

for i (1 2 3 4); do echo $i; done
1
2
3
4
Run Code Online (Sandbox Code Playgroud)