29

我在工作,但我相信指令也会有所帮助。

我需要一个 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。看起来好像它完全忽略了我的变量。

我搞砸了有什么想法吗?

4

4 回答 4

54

它实际上比这简单得多:

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

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

总之:

  • 分配给foo,而不是$foo(外壳会尝试扩展$foo并分配给它扩展的任何内容;通常没有用)
  • 直接使用循环变量;它包含数组而不是索引
于 2012-06-04T20:12:48.273 回答
27

为什么要麻烦使用数组?这可以很容易地在便携式 sh 中完成:

lw='plugin1 plugin2 plugin3'

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

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

于 2012-06-04T20:31:17.687 回答
7

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

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
于 2020-03-31T11:59:55.177 回答
0

对于其他最终在这里与shell脚本,文件名中的数组和空格搏斗的人......就像我下面的文件列表;

$ ls *.meta
20160324 1850 - ABC - Clarke And Dawe.ts.meta
20160706 1515 - 9Gem - Agatha Christie's Poirot.ts.meta
20181213 0155 - 10 BOLD - Star Trek_ The Next Generation.ts.meta
20210424 1927 - ABCTV HD - The Durrells.ts.meta
20210501 1927 - ABCTV HD - The Durrells.ts.meta
20210818 1930 - SBS ONE HD - Tony Robinson's World By Rail.ts.meta

经过大量搜索和尝试不同的方法后,这被证明是问题最少的并且适用于 MacOS 10.15

eval "list=( $(find . -name "*.ts" -exec echo \"{}\" \;) )"
for name in "${list[@]}"
do
res=`mediainfo --Output=''Video\;\%Width\%:%Height\%'' "$name"`
echo ${name} :: $res
sed -i .bak -e 5s/\;[[:digit:]]*:[[:digit:]]*// -e 5s/$/\;$res/ "$name.meta" 
done

忽略我试图实现的内部结构,关键方面是使用 eval 并在 find 内的 echo 中将双引号包裹在文件名周围。(我在做什么?我从 Enigma2 PVR 记录中提取分辨率并将其写入相关元数据文件的第 5 行)

感谢所有就 shell 脚本生成的各种问题发表自己的知识的人。

于 2021-10-14T23:48:26.663 回答