![如何在 zsh 中迭代间隔字符串对数组?](https://linux22.com/image/1702351/%E5%A6%82%E4%BD%95%E5%9C%A8%20zsh%20%E4%B8%AD%E8%BF%AD%E4%BB%A3%E9%97%B4%E9%9A%94%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AF%B9%E6%95%B0%E7%BB%84%EF%BC%9F.png)
我正在读这篇文章这里并尝试了解决方案。
但是,下面没有产生任何输出。我遗漏了什么?
arr=( '102 351' '576 324' '427 321' )
for str in "$arr[@]"; ✔
do ./findgcd $str | cat >> output;
done;
output
文件保持为空但没有看到错误。
答案1
与其他一些 shell 不同,zsh
它不会自动根据空格拆分变量,因此findgcd
调用时会传递单个字符串。showArgs
下面脚本中的函数演示了会发生什么以及如何使用扩展强制拆分单词$=
:
#!/usr/bin/env zsh
showArgs() {
printf -- '%-9s:' "${1}"
shift
printf ' "%s"' "$@"
print
}
arr=( '102 351' '576 324' '427 321' )
for str in "$arr[@]"; do
showArgs 'No split' ${str}
showArgs 'Split' ${=str}
# ./findgcd ${=str} >> output
findgcd ${=str}
print
done
输出:
No split : "102 351"
Split : "102" "351"
3
No split : "576 324"
Split : "576" "324"
36
No split : "427 321"
Split : "427" "321"
1
将数组按对处理的另一个方法是zsh
:
arr=(
102 351
576 324
427 321
)
for a b in $arr; do
showArgs 'pairs' $a $b
findgcd $a $b
done
输出:
pairs : "102" "351"
3
pairs : "576" "324"
36
pairs : "427" "321"
1