AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 567792
Accepted
James Wright
James Wright
Asked: 2020-02-16 09:40:50 +0800 CST2020-02-16 09:40:50 +0800 CST 2020-02-16 09:40:50 +0800 CST

zsh:for循环以换行符分隔的条目

  • 772

我有一个变量:

❯ echo $numholds     
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946

我想做一个 for 循环,但是换行符不起作用:

❯ for num in $numholds; do
echo $num ,
echo New Item!
> done                         
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946 ,
New Item!

这甚至发生在我设置IFS=$"\n \t". 我怎样才能使这项工作?

zsh array
  • 2 2 个回答
  • 3389 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2020-02-16T13:22:23+08:002020-02-16T13:22:23+08:00

    要在 zsh 中拆分换行符,请使用f 参数扩展标志(f用于line feed),它是以下内容的缩写ps:\n::

    for num (${(f)numholds}) print -r New item: $num
    

    您还可以使用$IFS-splitting (与其他类似 Bourne 的外壳相反),您必须使用语法zsh明确要求参数扩展(看起来有点像一把剪刀):$=param$=

    for num ($=numholds) print -r New item: $num
    
    • 11
  2. terdon
    2020-02-16T10:14:29+08:002020-02-16T10:14:29+08:00

    你的变量是一个字符串,而不是一个数组。它恰好包含换行符是不相关的。您for num in $numholds将整个事物视为单个值,因为这就是您存储它的方式。

    简单的解决方法是使用while循环和<<<here-string 构造来提供它:

    % while read num; do echo "$num"; echo "New Item"; done <<<"$numholds"
    409503
    New Item
    409929
    New Item
    409930
    New Item
    409932
    New Item
    409934
    New Item
    409936
    New Item
    409941
    New Item
    409942
    New Item
    409944
    New Item
    409946
    New Item
    

    这基本上等同于丑陋的(请参阅此处了解为什么这是一个坏主意):

    % for num in $(echo "$numholds"); do echo $num; echo "new item"; done
    409503
    new item
    409929
    new item
    409930
    new item
    409932
    new item
    409934
    new item
    409936
    new item
    409941
    new item
    409942
    new item
    409944
    new item
    409946
    new item
    

    最后,您可能希望将变量设为数组:

    numArray=($(echo "$numholds"))
    

    您现在可以使用所需的构造:

    % for num in "${numArray[@]}"; do echo $num; echo "new item"; done                   
    409503
    new item
    409929
    new item
    409930
    new item
    409932
    new item
    409934
    new item
    409936
    new item
    409941
    new item
    409942
    new item
    409944
    new item
    409946
    new item
    tpad% 
    
    • 4

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve