Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环数组变量问题的ZSH_Zsh_Bash_Arrays_Shell_Unix_For Loop - Fatal编程技术网

循环数组变量问题的ZSH

循环数组变量问题的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。它看起来好像忽略

我在工作,但我相信指导也会有帮助

我需要一个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=('plugin1' 'plugin2' 'plugin3')

for i in $lw; do
  . ~/Library/Rogall/plugins/$i/lw.prg end
done
总之:

  • 分配给
    foo
    ,而不是
    $foo
    (shell将尝试扩展
    $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默认值,那么它是不可移植的。数组是一个更好的解决方案。