Zsh - 使用点运算符时用空格分割字符串
Zsh - split string by spaces when using dot operator
这是我的脚本:
#/bin/bash
list="a b c"
for i in $list; do
echo $i
done
这个有效:
➜ ~ ./lol.sh
a
b
c
这不是:
➜ ~ . ./lol.sh
a b c
为什么拆分不能与点命令一起使用,我该如何解决?
列表永远不应表示为字符串。使用数组语法。
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 的值,不能保证默认值,尤其是 来自单独的脚本时(可能已在本地更改) .
- 不加引号的扩展也会执行通配,这可能会根据当前工作目录中的文件而产生不同的结果(例如,如果您的列表包含
hello[world]
,如果您当前的目录包含名为 hellow
、helloo
或以其他方式匹配 glob 的文件。
- 避免通配步骤不仅更正确,而且效率更高。
虽然我注意到 Charles Duffy 关于列表的评论,但这是我的 solution/test。
#!/bin/zsh
function three()
{
first=
second=
third=
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
这是我的脚本:
#/bin/bash
list="a b c"
for i in $list; do
echo $i
done
这个有效:
➜ ~ ./lol.sh
a
b
c
这不是:
➜ ~ . ./lol.sh
a b c
为什么拆分不能与点命令一起使用,我该如何解决?
列表永远不应表示为字符串。使用数组语法。
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 的值,不能保证默认值,尤其是 来自单独的脚本时(可能已在本地更改) .
- 不加引号的扩展也会执行通配,这可能会根据当前工作目录中的文件而产生不同的结果(例如,如果您的列表包含
hello[world]
,如果您当前的目录包含名为hellow
、helloo
或以其他方式匹配 glob 的文件。 - 避免通配步骤不仅更正确,而且效率更高。
虽然我注意到 Charles Duffy 关于列表的评论,但这是我的 solution/test。
#!/bin/zsh
function three()
{
first=
second=
third=
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