read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已:

$ read name

1

$ echo "$name"

1

$ read

1

$ echo "$REPLY"

1

当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此而已。然而今天我却发现个细微的区别(下面为了显示空格故意加了背景色):

$ read name

1

$ echo "$name"

1

$ read

1

$ echo "$REPLY"

1

看到了吧,当你使用自定义的变量名时,用户输入的字符串中开头和尾部的 IFS 空白符都会被 strip 掉,而使用默认的 REPLY 变量时,就不会有这个操作。我翻了下 Bash 源码,找到了一段专门为这个行为写的注释:

/* If there are no variables, save the text of the line read to the
variable $REPLY. ksh93 strips leading and trailing IFS whitespace,
so that `read x ; echo "$x"' and `read ; echo "$REPLY"' behave the
same way, but I believe that the difference in behaviors is useful
enough to not do it. Without the bash behavior, there is no way
to read a line completely without interpretation or modification
unless you mess with $IFS (e.g., setting it to the empty string).
If you disagree, change the occurrences of `#if 0' to `#if 1' below. */

也就是说,Bash 作者觉的,应该留一个方便的,不用改 IFS 就能让 Shell 能获取到用户完整的输入的字符串的小技巧。里面也说了,ksh 没有这个特殊处理,这是 Bash 自己发明的小把戏。

read name 和 read 在 Bash 中的区别相关推荐

  1. bash中(),{},(()),[],[[]]的区别

    前言:在bash中遇到各种括号,同时在进行字符数值比较判定时,总是不断出现问题,于是通过参考<advanced bash-scripting guide>,同时在centos 6.7版本上 ...

  2. 如何在 bash 中使用索引数组

    数组是一种数据结构,表示具有相同数据类型的对象集合.bash shell中支持两种类型的数组:关联数组或索引数组.在本文中,将演示如何在 bash 中使用索引数组.以下使用 shell 示例来说明索引 ...

  3. 如何在 bash 中使用键值字典

    在字典中,字典存储一组键,每个键都有一个与之关联的值.可以使用对应的键在字典中插入.检索或更新值.字典数据结构针对基于键值的快速检索进行了优化,因此通常使用哈希表来实现.在不同的编程语言中,字典通常有 ...

  4. 2.7-egrep及bash中的变量

    egrep及扩展的正则表达式 egrep=grep -E grep [OPTIONS] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配: .: []: [^]: 次数匹配: * ...

  5. linux bash中too many arguments问题的解决方法

    linux bash中too many arguments问题的解决方法 参考文章: (1)linux bash中too many arguments问题的解决方法 (2)https://www.cn ...

  6. 如何在Bash中加入数组元素?

    如果我在Bash中有这样的数组: FOO=( a b c ) 如何用逗号将元素加入? 例如,产生a,b,c . #1楼 重复使用@无关紧要的解决方案,但是通过避免$ {:1}的替换和避免中间变量的使用 ...

  7. Bash中的管道输出和捕获退出状态

    我想执行Bash中长时间运行的命令,都捕获它的退出状态,并且发球它的输出. 所以我这样做: command | tee out.txt ST=$? 问题在于变量ST捕获了tee而不是命令的退出状态. ...

  8. 如何在Bash中比较字符串

    如何将变量与字符串进行比较(如果匹配则执行某些操作)? #1楼 要将字符串与通配符进行比较,请使用 if [[ "$stringA" == *$stringB* ]]; then# ...

  9. 如何检查Bash中是否设置了变量?

    我如何知道是否在Bash中设置了变量? 例如,如何检查用户是否将第一个参数赋予函数? function a {# if $1 is set ? } #1楼 检查是否设置了变量 var="&q ...

最新文章

  1. access-control-allow-origin php,PHP通过Access-Control-Allow-Origin 跨域
  2. Ubuntu下添添加的用户没有sudo权限的解决办法
  3. 【白话机器学习】算法理论+实战之支持向量机(SVM)
  4. 【转】Hibernate和IBatis对比
  5. k3s文档:中文文档地址
  6. [LeetCode] Add Digits - 数字各个位数求和
  7. MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
  8. MATLAB显示错误使用untitled,使用Matlab 2016a阻止集合构建错误
  9. 【底层原理】x86-64体系下一个奇怪问题的定位
  10. vue如何编写组件可以通过Vue.use()使用
  11. Ubuntu 16.04安装Docker
  12. javascript快速入门(二):JS浏览器操作
  13. 产品经理如何搭建自己的知识地图?
  14. http://www.eoeandroid.com/thread-153979-1-1.html
  15. 破解Prezi桌面版30天限制的方法
  16. 基于arduino ws2812b简单的渐变代码
  17. 山东农业大学计算机考研资料汇总
  18. python如何编写温度转换_用python写温度转换
  19. 2014年 IT 行业校招待遇
  20. 数学建模(2)--TOPSIS法

热门文章

  1. 机器学习之 weka学习(四)
  2. 如何开发出优秀的APICloud应用
  3. C# 字符,字符串和文本处理。
  4. 从零开始编写自己的C#框架(1)——前言
  5. HDUOJ----4501小明系列故事——买年货(三维背包)
  6. element ui封装 tree下拉框
  7. Vuex说明及Todos项目改造
  8. Vue — 第五天(路由)
  9. (Review cs231n) Backpropagation and Neural Network
  10. BootstrapValidator验证