Zsh - 使用点运算符时按空格分割字符串

时间:2015-08-24 15:27:23

标签: shell scripting split zsh

这是我的剧本:

#/bin/bash
list="a b c"
for i in $list; do
  echo $i
done

这有效:

➜  ~  ./lol.sh 
a
b
c

这不是:

➜  ~  . ./lol.sh 
a b c

为什么split不能用于dot命令,我该如何解决?

2 个答案:

答案 0 :(得分:2)

列表不应该表示为字符串。使用数组语法。

list=( a b c )
for i in "${list[@]}"; do
  echo "$i"
done

这有几个原因。

在ZSH中:

  • ZSH通过不对未引用的扩展执行字符串拆分来破坏POSIX,除非它们明确请求它。您可以通过运行setopt sh_word_split或使用参数扩展${(=)list}${(ps: :)list}
  • 来提出此请​​求

在其他Bourne派生的shell中:

  • 字符串拆分取决于IFS的值,当从单独的脚本(可能在本地更改)时,IFS的值不能保证是默认值,尤其是
  • 不带引号的扩展还会执行通配,根据当前工作目录中的文件,可能会有不同的结果(例如,如果列表包含hello[world],如果当前目录包含,则会以意外方式执行名为hellowhelloo或以其他方式匹配glob的文件。
  • 避免全球化步骤不仅更正确,而且效率更高。

答案 1 :(得分:0)

虽然我注意到 Charles Duffy 对列表的评论,但这是我的解决方案/测试。

#!/bin/zsh
function three()
{
        first=$1
        second=$2
        third=$3
        echo "1: $first 2: $second 3:$third"
}

setopt sh_word_split
set "1 A 2" "2 B 3" "3 C 4" "4 D 5"
for i;do
        three $i;

 done

这将输出

1: 1 2: A 3:2
1: 2 2: B 3:3
1: 3 2: C 3:4
1: 4 2: D 3:5