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 / 问题 / 683113
Accepted
Algerian_Amazigh_05
Algerian_Amazigh_05
Asked: 2021-12-20 13:21:23 +0800 CST2021-12-20 13:21:23 +0800 CST 2021-12-20 13:21:23 +0800 CST

为什么echo的输出有差异

  • 772

我在 Ubuntu 20.04 上使用 Bash 5.0.17

这是对这个问题的跟进。在问这个问题之前,我以为我了解它是如何IFS工作的,但现在我完全糊涂了,我有一连串的问题:

  1. 静态字符串是什么意思?
  2. 分词和扩展有什么区别?
  3. 我在这个网站的某个地方读到推荐引用变量(*),但有时我会得到不同的结果,例如:
IFS=":"; for i in 1:2:3; do echo $i; done # output: 1 2 3
IFS=":"; for i in 1:2:3; do echo "$i"; done # output: 1:2:3

# Why do the quotes make a difference between the two commands?

请,如果您认为这些是愚蠢的问题,请忽略它。如果有人有兴趣帮助我消除这种困惑,我将非常感谢他/她的帮助

谢谢

编辑:在下面添加链接


(*):我指的是这两个答案:

  • 忘记在 bash/POSIX shell 中引用变量的安全隐患
  • 什么时候需要双引号?
bash
  • 2 2 个回答
  • 126 Views

2 个回答

  • Voted
  1. pLumo
    2021-12-20T23:31:27+08:002021-12-20T23:31:27+08:00

    您的for-loop 的行为不像您认为的那样:

    IFS=":"; for i in 1:2:3; do ...
    

    $i将是字面意思1:2:3,所以你的循环只运行一次。

    IFS仅通过变量扩展或使用read命令使用特殊变量拆分单词。

    这也是您问题的答案。

    当您运行IFS=:; i=1:2:3; echo $i;时,扩展(和单词拆分)仅发生在最后一个命令中,并且“单词”(1、2 和 3)分别回显 --> 1 2 3。(就像@ikkachu 在他的回答中已经说过的那样,这就是echo行为方式)。
    加上引号$i将防止分词,并将echo按字面意思输出变量 ( 1:2:3)。


    您还可以使用这些知识for通过使用变量扩展来修复循环:

    IFS=:; var=1:2:3; for i in $var; do echo $i; done
    

    将输出:

    1
    2
    3
    
    • 3
  2. Best Answer
    Algerian_Amazigh_05
    2021-12-21T02:55:14+08:002021-12-21T02:55:14+08:00

    我想我已经找到了我的问题的答案(对于最后两个问题,感谢这个网页)。

    1.什么是静态字符串?

    这不是准确的措辞。但我认为这意味着一个“文字”字符串。

    2、扩容和分词有什么区别?

    扩展是指:大括号扩展、波浪号扩展、Shell 参数和变量扩展(这涉及使用$符号)、命令替换、算术扩展、进程替换、分词和文件名扩展。

    所以分词是扩展的特例,引用上面的网页:

    shell 扫描双引号内未出现的参数扩展、命令替换和算术扩展的结果以进行分词。

    shell 将 $IFS 的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。如果 IFS 未设置,或者它的值恰好是默认值“''”,那么任何 IFS 字符序列都用于分隔单词。如果 IFS 的值不是默认值,则在单词的开头和结尾处忽略空格字符“space”和“Tab”的序列,只要空格字符在 IFS 的值中(一个 IFS 空格特点)。IFS 中不是 IFS 空白的任何字符,以及任何相邻的 IF 空白字符,都会分隔一个字段。IFS 空白字符序列也被视为分隔符。如果 IFS 的值为空,则不发生分词。

    保留显式空参数(“”“”或“''”)。不带引号的隐式空参数由没有值的参数的扩展产生,被删除。如果在双引号内扩展了没有值的参数,则会产生并保留空参数。

    但要记住的重要一点是:

    ?️如果没有发生扩展,则不执行拆分。?️

    3.第三题由第2题回答。

    • -2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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