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

标签 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 命令,我该如何解决?

最佳答案

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

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)。
  • 避免通配步骤不仅更正确,而且更有效。
  • 关于shell - Zsh - 使用点运算符时按空格拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32186056/

    相关文章:

    linux - 如何捕获 sudo 命令的交互响应?

    git - `git branch --list` 返回文件?

    java - 拆分数组 - 我的实现正确吗?

    mongodb - Ubuntu 上安装的是什么版本的 MongoDB

    linux - 来自 shell 脚本的后台 rsync 和 pid

    bash - 递归移动某种类型的文件并保持其目录结构

    java - 是否应该使用自定义 SecurityManager 来对 javax.script.ScriptEngine 进行沙盒处理?

    Bash:添加内联 if 来修改脚本

    python - 在 Pandas 中拆分和加入系列

    python - 如何拆分列表中的字符串