Bash 读取命令

2023-10-26

Bash 附带了许多内置命令,您可以在命令行或 shell 脚本中使用这些命令。

在本文中,我们将探讨内置read命令。

Bash read内置#

read是一个 bash 内置命令,它从标准输入(或文件描述符)读取一行并将该行拆分为单词。第一个单词分配给第一个名称,第二个单词分配给第二个名称,依此类推。

的一般语法read内置采用以下形式:

read [options] [name...]

要说明该命令的工作原理,请打开终端,输入read var1 var2,然后按“输入”。该命令将等待用户输入。输入两个单词并按“Enter”。

read var1 var2Hello, World!

这些单词被分配给传递给的名称read命令作为参数。使用echo or printf验证它:

echo $var1echo $var2
Hello,
World!

您可以将标准输入传递给read使用其他方法,例如管道、here-string 或heredoc :

echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read and echo括在括号中并在同一个子 shell 中执行。
Hello,
World!

这是使用here字符串和的示例printf:

read -r var1 var2 <<< "Hello, World!"printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello, 
Var2: World! 

当没有提供参数时read命令,整行被分配给REPLY多变的:

echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!

如果提供给的参数数量read大于从输入中读取的单词数,其余单词分配给姓氏:

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux 
Var2: is awesome.

否则,如果参数的数量小于名称的数量,则为其余名称分配一个空值:

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello, 
Var2: World! 
Var3: 

默认情况下,read将反斜杠解释为转义字符,这有时可能会导致意外的行为。要禁用反斜杠转义,请使用以下命令调用该命令-r option.

下面是一个示例,展示了如何read在有或没有调用时都有效-r option:

read <<< "Hello, \tWorld!"printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"printf %s "$REPLY"
Hello, \tWorld!

一般来说,您应该始终使用read-r option.

更改分隔符#

默认行为read是使用一个或多个空格、制表符和换行符作为分隔符将行拆分为单词。要使用另一个字符作为分隔符,请将其分配给IFS变量(内部字段分隔符)。

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux 
is 
awesome.

When IFS设置为空格或制表符以外的字符,单词之间仅由一个字符分隔:

echo "Linux::is:awesome." | \  (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")

该行由四个单词分隔。第二个字是一个空值,表示分隔符之间的段。它的创建是因为我们使用了两个相邻的分隔符(::).

Var1: Linux 
Var2:  
Var3: is 
Var4: awesome.

您可以使用多个分隔符来分割行。当指定多个分隔符时,将字符分配给IFS变量之间没有空格。

这是一个使用的示例_ an -作为分隔符:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux 
is 
awesome.

提示字符串#

编写交互式 bash 脚本时,可以使用read命令来获取用户输入。

要指定提示字符串,请使用-p选项。提示符在之前打印read已执行且不包含换行符。

这是一个简单的例子:

read -r -p "Are you sure?"

一般来说,您会使用read里面的命令while循环以强制用户给出预期答案之一。

下面的代码将提示用户系统重启 :

while true; do
    read -r -p "Do you wish to reboot the system? (Y/N): " answer
    case $answer in
        [Yy]* ) reboot; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer Y or N.";;
    esac
done

如果 shell 脚本要求用户输入密码等敏感信息,请使用-s选项告诉read不要在终端上打印输入:

read -r -s -p "Enter your password: "

将字分配给数组#

将单词分配给array而不是变量名,调用read命令与-a option:

read -r -a MY_ARR <<< "Linux is awesome."

for i in "${MY_ARR[@]}"; do 
  echo "$i"
done
Linux 
is 
awesome.

当给出数组和变量名时,所有单词都会分配给数组。

结论#

The read命令用于将一行输入拆分为单词。

如果您有任何问题或反馈,请随时发表评论。

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

Bash 读取命令 的相关文章

  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • 获取 Bash 和 KornShell (ksh) 中命令的退出代码

    我想写这样的代码 command some command safeRunCommand command safeRunCommand cmnd 1 cmnd if 0 then printf Error when executing co
  • 在 bash 中传递多个数组作为参数

    我已经成功地能够调用单个数组作为参数 但在传递多个数组时遇到问题 这是我到目前为止所拥有的 calling function array1 1 2 3 4 array2 a b c d array3 called function arra
  • 我可以在远程服务器上运行位于本地计算机上的 bash 脚本吗?

    我有本地脚本 我想在远程服务器上运行 我已经设置了 ssh 密钥对以启用无需密码的登录 我当前的方法是将脚本 rsync 到服务器 然后运行它 ssh user remoteserver rsync localserver script s
  • Bash 脚本问题

    我可以很好地运行这个命令 并得到我想要的输出 ifconfig eth0 grep HWaddr awk print 5 但是 当我将命令设置为变量并打印该变量时 出现错误 CASS INTERNAL ifconfig eth0 grep
  • 如何在 ssh 命令中使用长输入参数正确转义 qsub 命令?

    我有一个复杂的 qsub 命令可以远程运行 PROJECT NAME TEXT TEST PROJECT PACK ORGANIZATION source organization MY ORGANIZATION CONTACT NAME
  • 我可以在 chrome devtools 中执行 nodejs javascript 脚本吗?

    是否可以使用Chrome 开发工具执行终端命令node myfile js 所以chrome控制台会输出所有console log来自我的代码 我有一些terminal插件安装在我的 IDE 中 当我想在我的文件上运行此命令时 我使用一些键
  • 如何使用jq提取json值子字符串

    我有这个 json temperature 21 humidity 12 3 message Today ID 342 is running 我想使用jq来获取这个json temp 21 hum 12 3 id 342 正如你所看到的 我
  • 如何更改 VS Code 中的当前工作目录?

    如何更改 VS Code 中的当前工作目录 比方说 我有一个名为 apps 的父文件夹 其中有一个名为 MyBeautifulApp 的子文件夹 我使用 vscode 打开了 apps 文件夹 我应该在命令行上运行什么命令不仅cd进入 My
  • 使用 git-svn 时模拟 subwcrev

    我使用 git svn 与包含一些 C 项目的现有 SVN 存储库进行交互 subwcrev exe 用作预构建事件来更新 C 标头 svnversion h 中的某些字符串 这些字符串被硬编译以形成生成的二进制文件的一些版本信息 由于 s
  • bash fork 炸弹的另一个版本是如何工作的?

    我大致了解如何这个通用版本 https stackoverflow com questions 991142 how does this bash fork bomb work bash fork 炸弹的工作原理 然而 我见过另一个版本 特
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • ${ARGUMENT+x} 在 Bash 中意味着什么? [复制]

    这个问题在这里已经有答案了 我有一个使用以下语法的 bash 脚本 if z ARGUMENT x then 参数名称后面的 x 语法是什么意思 这意味着如果 ARGUMENT设置后 它将被字符串替换x 让我们在 shell 中尝试一下 e
  • 如何在 awk 或 sed 中编写查找所有函数(使用正则表达式)

    我有运行 python 的 bash 函数 它从标准输入返回所有找到的正则表达式 function find all python c import re import sys print n join re findall 1 sys s
  • Bash或Python,当打印字符到终端时,如何更改固定位置的字符?

    我想知道的事情应该是非常 基本 的 但这是我脑海中很长一段时间的问题 不知道窍门在哪里 假设在一个耗时的程序中 或者bash or Python 我必须打印出运行时的进度百分比 基本上我想打印1 一段时间后 我打印2 等等 我想要 2 完全
  • 使用 ffmpeg 从 unix 命令批量将 wav 文件转换为 16 位

    我有一个由许多子文件夹组成的文件夹 每个子文件夹都有其他子文件夹 其中包含 wav 文件 我想像这样转换所有文件 ffmpeg i BmBmGG BmBmBmBm wav acodec pcm s16le ar 44100 BmBmGG B
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 如何将 Markdown 文档批量转换为 HTML?

    我正在用 Markdown 编写一些文档 并为文档的每个部分创建一个单独的文件 我希望能够一次性将所有文件转换为 HTML 但我找不到其他人尝试过同样的事情 我使用的是 Mac 所以我认为一个简单的 bash 脚本应该能够处理它 但我从未在
  • Windows 终端中的图标和背景图像字段无法识别父进程目录

    Windows 终端版本 1 12 10732 0 Windows 内部版本号 19043 1645 Issue 如果这个问题已经在其他地方得到解决 请原谅我 但我意识到当Use parent process directory被检查 Co

随机推荐

  • 如何在 Debian 10 Linux 上安装和配置 Redis

    Redis 是一个开源内存键值数据存储 它可以用作数据库 缓存和消息代理 并支持各种数据结构 例如字符串 哈希 列表 集合等 Redis 通过 Redis Sentinel 提供高可用性 并通过 Redis Cluster 跨多个 Redi
  • 如何在 CentOS 8 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 可帮助您自动执行安装 更新 配置和删除 npm 包的过程 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 本教程将指
  • 使用 Python Pandas read_json 读取 JSON 文件

    Pandas read json 函数允许您读取 JSON 文件并将其转换为Pandas数据框 在本教程中 您将学习如何使用 Python 的 Pandas 加载 JSON 文件 处理各种 JSON 格式 自定义列标签 推断数据类型 解析日
  • Seaborn 热图教程(Python 数据可视化)

    在本教程中 我们将使用名为 seaborn 的 Python 库以热图形式表示数据 该库用于基于以下内容可视化数据Matplotlib 您将了解什么是热图 如何创建它 如何更改其颜色 调整其字体大小等等 所以让我们开始吧 目录 hide 1
  • 安装、配置和维护 Linux DNS 服务器

    DNS 域名系统 是计算机的命名系统 执行此操作的服务是 DNS 服务器 它将 IP 地址转换为人类可读的地址 这个进程是互联网的支柱 也是服务器中非常重要的服务 因此从那时起 我们将讨论 DNS 服务器 特别是 Linux DNS 服务器
  • Linux 中的 SSH 端口转发(隧道)

    在本教程中 我们将介绍 Linux 中的 SSH 端口转发 这是 SSH 实用程序的一项功能 Linux 管理员使用该实用程序在不同系统之间创建加密且安全的中继 您可以使用 SSH 端口转发 SSH 隧道 在两个或多个系统之间创建安全连接
  • 在几分钟内创建一个 Python Discord 机器人:简单教程

    Discord 机器人是在 Discord 平台上运行的自动化程序 机器人可以做各种各样的事情 从播放音乐 发送自动消息 管理角色 到踢掉违反规则的用户 以及许多其他任务 Discord 机器人的核心功能是基于事件构建的 例如 当发生新消息
  • 如何在 Apache/Nginx 中阻止 .git 目录

    版本控制系统 例如 Git 对于软件开发至关重要 但是 如果没有适当保护 它们可能会暴露敏感信息 许多 Web 开发人员错误地让 git 目录在生产环境中可访问 这可能允许任何人下载和查看存储库 本文演示了如何阻止对 gitApache 和
  • 如何在 macOS 上安装 LibreOffice

    如果您使用 macOS 您可能会使用 Apple 构建的应用程序 例如 Pages Numbers 和 Keynote 进行文字处理 电子表格和演示文稿 这些都是很棒的程序 具有很多功能并且易于使用 它们也不是免费的 您只能通过 Mac A
  • Linux 中的 whoami 命令(查找登录用户)

    whoami 是一个基本的 Unix Linux 命令 用于查找与当前有效用户 ID 关联的用户名 这通常用于识别 shell 中当前登录的用户 该命令也适用于外壳脚本识别运行脚本的用户 ID Syntax whoami OPTION Li
  • 如何在 PHP 中计算数组元素

    您可以使用 PHPcount or sizeof 函数获取数组中元素或值的数量 这count and sizeof 对于已使用空数组初始化的变量 方法返回 0 如果数组未初始化 您将看到错误 在这种情况下 您可以使用 isset 函数来检查
  • 如何禁用 Apache 中的目录列表

    Apache 是最流行的开源 Web 服务器之一 全球许多网站都在使用它 它的功能之一是能够在不存在索引文件时列出目录及其内容 此功能虽然对某些用途很方便 但可能会向公众公开有关网站结构或内容的敏感信息 在本文中 我们将引导您了解如何禁用
  • 如何在 Ubuntu 16.04 和 14.04 LTS 上安装 phpPgAdmin

    phpPg管理员是一个 Web 界面 用于以非常简单的方式访问和管理 PostgreSQL 数据库 我们可以轻松地创建新的数据库 数据库中的表 用户 存储过程等 此外 我们还可以执行PL pgSQL和其他存储过程 它还提供了从 Web 界面
  • ERROR 1114 (HY000): 表‘tablename’已满(解决方案)

    MySQL 是一种广泛使用的开源关系数据库管理系统 RDBMS 可实现高效的数据存储和检索 但是 用户偶尔可能会遇到错误 例如 ERROR 1114 HY000 The table table name is full 消息 当达到表的存储
  • 什么是Fish(友好交互式SHell)?

    鱼 或者 友好的交互式SHell 是一个 Unix shell 其设计重点是用户友好性和交互使用 它于 2005 年推出 由于其独特的功能 有用的默认设置以及对愉快的用户体验的关注 赢得了众多追随者 鱼的主要特征和特点 交互式自动完成 Fi
  • Unix/Linux 中什么是僵尸进程

    僵尸进程是指已完成执行但其父进程尚未终止并释放其资源的进程 在 Unix Linux 中 处于这种状态的进程被视为僵尸进程 这些进程会占用宝贵的系统资源 如果处理不当 可能会导致稳定性问题 以下是了解和处理 Unix Linux 中僵尸进程
  • 您绝对需要的 7 件在家办公必需品

    甚至在 COVID 19 大流行爆发之前 很多人就在家工作 然而 他们中的大多数人并不是全职在家工作 这就是为什么这种强制性的远程办公可能异常难以适应 虽然业务模式或工作实践的每次变化都需要一些时间来适应 但您需要记住 有很多方法可以稍微促
  • 在 Laravel 中设置文件权限的正确方法:详细教程

    Laravel 是一种流行的 Web 应用程序开发 PHP 框架 非常注重安全性 在 Laravel 的众多安全考虑因素中 正确设置文件权限至关重要 如果没有正确的权限 您的应用程序可能容易受到攻击 或者可能由于缺乏必要的访问权限而发生故障
  • 如何保护 Apache 中的特定 URL

    阻止用户访问特定网页有助于防止他们接触敏感信息 如果您将站点托管在 Apache 服务器上 则可以通过锁定特定 URL 来锁定站点 如果您只需要阻止访问单个页面 则可以锁定 URL 而无需锁定整个站点 使用 Apache 有多种方法可以做到
  • Bash 读取命令

    Bash 附带了许多内置命令 您可以在命令行或 shell 脚本中使用这些命令 在本文中 我们将探讨内置read命令 Bash read内置 read是一个 bash 内置命令 它从标准输入 或文件描述符 读取一行并将该行拆分为单词 第一个