Bash 将带引号的行分割成参数

2023-12-06

希望这个问题以前没有出现过。至少我没有找到答案。也许看起来不太好:(

假设我收到了这段文字:

hello "hello" "hello world"

请告诉我为什么这两个脚本有不同的输出?:

1)文本保存在文件中

#!/bin/bash
while read line
    do
        set $line
        echo $1
        echo $2
        echo $3
    done < "file"

输出是:

hello
"hello"
"hello

2) 脚本中硬编码的文本

#!/bin/bash
set hello "hello" "hello world"
echo $1
echo $2
echo $3

这是输出:

hello
hello
hello world

我想在从不同文件读取行时获得第二种行为。请各位堆垛机帮忙:(


这是一个 shell 命令:

set hello "hello" "hello world"

因为是shell命令,所以shell执行报价删除作为执行命令之前的最后一步。

将其与文件中的文本进行对比:

$ cat file
hello "hello" "hello world"

当 shell 读取此文件时,它将引号视为另一个字符。该文件中的引号永远不会直接出现在命令行上,因此它们不受报价删除.

文档

从以下部分中man bash讨论扩展:

报价删除

在前面的扩展之后,所有未加引号的字符 \、' 和 " 不是由上述之一产生的 扩展被删除。

分词和引用删除如何相互作用

Bash 确实分词在引用删除之前。这很重要,例如对于以下命令:

set hello "hello" "hello world"

当 shell 进行分词时,它会找到三个参数set命令。它只是作为执行前的最后一步setshell 确实删除了引号。由于没有进行进一步的分词,因此参数的数量set仍为三。

让我们将上面的结果与从文件中读取一行的结果进行对比:

$ cat file
hello "hello" "hello world"
$ read line <file
$ echo "$line"
hello "hello" "hello world"

如上所述,shell 不会删除内容的引号line。现在,让我们使用$line作为论点set:

$ set $line
$ echo $#
4

找到四个参数。这些论点是:

$ echo 1=$1 2=$2 3=$3 4=$4
1=hello 2="hello" 3="hello 4=world"

正如您所看到的,文件中的引号被视为普通的普通字符,就像,h or e。最后,"hello world"文件中的内容被扩展为两个单词,每个单词都有一个引号字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 将带引号的行分割成参数 的相关文章

  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • Bash 正则表达式——似乎无法匹配任何 \s \S \d \D \w \W 等

    我有一个脚本试图从 gparted 获取信息块 我的数据如下所示 Disk dev sda 42 9GB Sector size logical physical 512B 512B Partition Table msdos Number
  • 带有变量 bash 的降序循环

    cat fromhere sh bin bash FROMHERE 10 for i in seq FROMHERE 1 do echo i done sh fromhere sh 为什么不起作用 我找不到任何在谷歌中搜索降序循环的示例 甚
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • 高效的内存屏障

    我有一个多线程应用程序 其中每个线程都有一个整数类型的变量 这些变量在程序执行期间递增 在代码中的某些点 线程将其计数变量与其他线程的计数变量进行比较 现在 我们知道在多核上运行的线程可能会无序执行 一个线程可能无法读取其他线程的预期计数器
  • 如何在 OS X 上查看 $PATH 变量的当前值?

    PATH returns bash usr local share npm bin Library Frameworks Python framework Versions 2 7 bin usr local bin usr local s
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • 使用 python 更改目录

    我碰巧发现我无法从 python 代码中更改实际目录 我的测试程序如下 from os import system def sh script system bash c s script sh cd home sh pwd 的输出pwd
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • 如何使用存储在文本文件中的选项在 bash 中显示选择菜单? [复制]

    这个问题在这里已经有答案了 如何使用我存储在文本文件的各行中的选项为用户显示选择菜单 例如 我的文本文件 ingestion txt 如下所示 SOUP FTS CTS JDBC NEW 我希望用户看到这个 Please select an
  • 如何在不同目录中启动多个窗口的 tmux?

    我想使用脚本打开一个有 6 个窗口的 tmux 会话 每个窗口位于不同的目录中 我开始于我找到的一个脚本 http blog hawkhost com 2010 07 02 tmux E2 80 93 the terminal multip
  • 使用 plistBuddy 获取值数组

    var keychain access groups declare a val usr libexec PlistBuddy c Print var sample plist echo val echo val 0 Ouput Array
  • 如何使用 sed 将空格替换为 \(space)?

    当我使用 sed 将所有空格替换为 X 时 该命令有效 命令为 sed s X g filelist tmp 但是 当我尝试用 space 替换所有出现的空格时 代码是 sed s g filelist tmp 这不起作用 我究竟做错了什么
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • IBM AIX:核心-外壳:显示文件修改日期

    我想用 bash 做这样的事情 查看文件上次修改的时间 ls lha ls full time 但我必须在 AIX 上使用 core shell 怎样才能达到这样的效果呢 您可以使用 istat istat test ksh Inode 8
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • Ansible 输出格式选项

    是否有一个选项可以使用 ansible 而不是任何其他脚本 来格式化 ansible 输出 例如 name Show version sudo true hosts web front end tasks name Create yum c

随机推荐

  • 在 Android 中打开 pdf 时出现问题:文件路径无效

    我需要从我的 Android 应用程序打开一个 pdf 文件 我将 pdf 保存在应用程序包文件夹 data data com app example files 中 我已经在 android 模拟器中安装了 adobe reader 应用
  • Highcharts 中的径向饼图数据标签

    如何将数据标签置于饼图楔形 内部 的中心并与饼图半径对齐 而不是水平或垂直对齐 这是我所追求的图像 如果不是开箱即用的功能 也许有人有一个插件 或者甚至一些实验代码也会有用 Highcharts 不提供在饼图中自动旋转数据标签的选项 您可以
  • 构建 android 项目时出现 CXX1405 cmake 异常

    当我构建项目时出现错误 如下所示 我尝试了很多事情但从未成功 我使用的是 m1 MacBook 这与此错误有关吗 CXX1405 构建 Json 时出现异常启动进程 命令 Users serhat Library Android sdk c
  • 以编程方式创建扩展的 UItableViewCell

    我有一个 tableviewcell 我想在点击时展开和折叠 我找到的所有示例都是故事板基础 我正在尝试以编程方式执行此操作 我最初的想法是创建一个子视图并将其限制到内容视图 但是当我使用以下命令调整单元格的高度时heightForRowA
  • 如何从对于内存来说太大的文件构建(或预先计算)直方图

    python 是否有一个图形库不需要将所有原始数据点存储为numpy数组或列表以绘制直方图 我有一个数据集对于内存来说太大 并且我不想使用子采样来减少数据大小 我正在寻找的是一个可以获取生成器输出的库 从文件生成的每个数据点 作为float
  • 在 Mac 上的 XAMPP 上安装 PHP 7.0 国际化扩展 (Intl)

    我按照此处概述的说明进行操作 在 Mac 上的 XAMPP 上安装 PHP 国际化扩展 Intl 运行 sudo pecl install intl 从地窖中选择了正确的文件 然后发生了这个错误 private tmp pear temp
  • 是否有 CheckStyle 规则强制 if else 关键字位于 if/else 梯形图中的同一行?

    基于这个问题看来 CheckStyle 的默认模板将允许 if else 梯子将if and else有换行符 意思是我愿意this被标记为违规的代码 if true System out println 20 else if true S
  • 按字体计算 Microsoft Word 文档中的字数?

    我有一个包含代码示例的大型文档 我想知道字体 Calibri Body 中所有文本的字数 无论大小如何 我想忽略 Consolas 等 我有一个按斜体计数的宏 作为示例发布 但无法运行它 Sub IgnoreItalics Dim lngW
  • R Shiny 观察事件问题

    当在数据表中选择行并且有人按下 删除行 开关时 我试图从数据框中删除行 input click rows selected 给出所选行的 id 我使用observeEvent和observe似乎有问题 因为代码在我第一次轻按开关时删除了选定
  • Facebook 分享/评论无法正常工作

    在我的页面中 我添加了 Facebook 评论和分享按钮 一切都是按照他们的指示完成的 所以 我已经包含了加载脚本 div div
  • Facelets:使用 ui:param 将 bean 名称传递给操作属性

    由于某些自定义组件在其属性中需要 bean 名称 而不是 bean 实例 因此我需要在页面之间传递实际的 bean 名称 由于 bean 本身也被非自定义组件使用 我想避免使用额外的ui param 就像这里描述的那样在 中传递操作 因为它
  • 奇怪 - mysql 的 sql::SQLException 没有被它的类型捕获,而是被捕获为 std::exception 并成功地返回

    我正在使用 mysql c 连接器和这个 有点简化的 代码 try statement gt setString 1 word statement gt executeUpdate catch sql SQLException e I do
  • 如何以delphi形式使用Gif动画

    我认为 gif 动画图像没有原生支持 怎样才是最好的方法呢 任何允许这样做的免费组件 我正在考虑使用 TImage 和 ImageList Timer 但我需要将 gif 的每一帧导出到单独的 bmp 文件 在现代 Delphi 中这非常简
  • 使用 JSON 填充图表时 Google 图表中的工具提示

    我目前正在使用 JSON 填充我的 Google 图表 但我还需要自定义工具提示 目前我的 JSON 如下所示 cols id label date type string id label price type number rows c
  • python / scikit-learn 中距离计算的稀疏实现

    我有一个 svmlight 格式的大型 100K x 30K 且 非常 稀疏的数据集 加载如下 import numpy as np from scipy cluster vq import kmeans2 from scipy spati
  • 在 Ubuntu 上找不到 Java 应用程序主类

    我正在使用 Gradle 应用程序插件来分发适用于 Windows 和 Ubuntu Linux Mac 等的 Java 应用程序 几周前我在 Linux 上对此进行了测试 效果非常好 今天 在我的 Linux 机器上找不到我的 Main
  • Python 找不到 System32

    我想打开我创建的一个exe 它位于Windows的System32文件夹中 我通过以下命令执行此操作 subprocess call C Windows System32 ListTest exe 但不知何故Python找不到System3
  • java守护线程

    大家好 当封闭的线程完成时 守护线程会停止工作吗 或者当 主 线程完成时守护线程将停止 我在 jre6 上测试了这个例子 结果是daemon thread stopped working when the enclosing it thre
  • 如何使单击事件适用于具有同一类的多个元素?

    我试图在每次用户单击多个图块时实现翻转效果 这有点像仪表板类型网页的开始 如何使点击事件适用于多个同名类 所有图块都具有相同的类名 但在不同的 box div 下 jquery 单击事件似乎仅在添加的最后一个图块中实现 而其他图块保持静态
  • Bash 将带引号的行分割成参数

    希望这个问题以前没有出现过 至少我没有找到答案 也许看起来不太好 假设我收到了这段文字 hello hello hello world 请告诉我为什么这两个脚本有不同的输出 1 文本保存在文件中 bin bash while read li