循环数组变量问题的ZSH
我在工作,但我相信指导也会有帮助 我需要一个for循环,它遍历数组循环数组变量问题的ZSH,zsh,bash,arrays,shell,unix,for-loop,Zsh,Bash,Arrays,Shell,Unix,For Loop,我在工作,但我相信指导也会有帮助 我需要一个for循环,它遍历数组lw中存储的值,然后根据数组中存储的名称值启动一个shell脚本 到目前为止,我的想法是: $lw=('plugin1' 'plugin2' 'plugin3') for i in $lw; do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end; done 运行此命令时,会出现一个错误,表示它找不到~/Library/Rogall/plugins//lw.prg。它看起来好像忽略
lw
中存储的值,然后根据数组中存储的名称值启动一个shell脚本
到目前为止,我的想法是:
$lw=('plugin1' 'plugin2' 'plugin3')
for i in $lw;
do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end;
done
运行此命令时,会出现一个错误,表示它找不到~/Library/Rogall/plugins//lw.prg
。它看起来好像忽略了我的变量
你知道我哪里搞砸了吗?其实要简单得多:
lw=('plugin1' 'plugin2' 'plugin3')
for i in $lw; do
. ~/Library/Rogall/plugins/$i/lw.prg end
done
总之:
- 分配给
,而不是foo
(shell将尝试扩展$foo
,并分配给它扩展到的任何对象;通常不有用)$foo
- 直接使用循环变量;它包含数组值而不是索引
- 为什么要麻烦使用阵列?这可以在便携式sh中轻松完成:
lw='plugin1 plugin2 plugin3'
for i in $lw;
do . ~/Library/Rogall/plugins/$i/lw.prg end
done
请注意,要在zsh中实现这一点,您需要让zsh正确处理:
set-o shwordsplit
我遇到了一个问题,像这样的循环
for i in (1 2 3 4); do echo $i; done
一次又一次地不按我的要求工作。我会得到像zsh:unknown file attribute:1这样的错误,或者像这样的输出
1 2 3 4
不管我如何扭曲它,而不是我想要的
1
2
3
4
为了获得我想要的行为,我必须从循环定义中删除in
关键字
for i (1 2 3 4); do echo $i; done
1
2
3
4
试着echo$i
看看它包含什么。这很有意义!非常感谢。或者仅仅是i($lw)的~/Library/Rogall/plugins/$i/lw.prg end
在一般情况下,for i in$array
会跳过空元素。您需要for i in“$array[@]”
或for i in“${(@)array}”
来保留空的字符(或与ksh/bash兼容的语法:for i in“${array[@]}”
)?只需将('plugin1''plugin2''plugin3')
直接放在$lw
的位置。并不是所有的东西都是可以移植的,特别是如果它要在Mac上运行(从目录名判断)。对于每个单词中可能有空格的一般情况,您的解决方案也失败。@Moritz这不是一般情况,而是文件名中没有空格的特定情况。可移植性可能并不总是必要的,但它始终是一个理想的目标。这个解决方案在Mac电脑上运行得很好。@Moritz和文件名中的空格是令人讨厌的!此外,如果文件名中有空格,Jan的解决方案就会失败。你怎么知道插件目录中没有空格?原始帖子中的名字非常通用,因此可以安全地假设它们不是真实的名字。Jan的解决方案将在具有特定设置的zsh上正常工作。即使不是这样,也可以通过两个小改动来实现。您的解决方案无法轻松用于空白。但遗憾的是,像“文件名中的空格是一个令人憎恶的东西”这样的事情是如此令人难以置信地引起了争论,以至于它一点都不好笑。但是,让我们到此为止,同意不同意。如果它依赖于在上下文可能是.zshrc文件时更改的ZSH默认值,那么它是不可移植的。数组是一个更好的解决方案。