{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-02-03 09:34:10","updateBy":"admin","updateTime":"2025-06-16 20:18:09","remark":null,"id":46,"articleTitle":"Shell（五）read命令","articleUrl":"shell_read","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"read命令可以读取控制台输入，实现用户与脚本交互式操作。read还同样可以用来读取文件内容","articleContent":"## read命令\n\n```bash\n格式与选项\nread [选项] [变量名]\n-p \"提示信息\" # 等待read输入时的提示信息\n-t 秒数 # read命令会一直等待用户输入，使用此选项可以指定等待时间，超过等待时间会退出\n-n 字符数 # 只接受指定数量的字符，然后就会执行\n-s # 隐藏输入内容，适用于密码等机密信息的输入\n-d  # 表示delimiter，即定界符，一般情况下是以IFS为参数的间隔，但是通过-d，我们可以定义一直读到出现执行的字符位置。例如read –d madfds value，读到有m的字符的时候就不在继续向后读，例如输入为 hello m，有效值为“hello”，请注意m前面的空格等会被删除。这种方式可以输入多个字符串，例如定义“.”作为结符号等等。\n-r # 在参数输入中，我们可以使用’/’表示没有输入完，换行继续输入，如果我们需要行最后的’/’作为有效的字符，可以通过-r来进行。此外在输入字符中，我们希望/n这类特殊字符生效，也应采用-r选项。\n\n变量名：可以自定义，如果不指定变量名，会把输入内容保存进默认的变量REPLY中，如果只提供一个变量名，则整个输入行会赋予该变量。如果提供了一个以上的变量名，则会把输入行分为若干个字符，一个接一个的赋予各个变量，最后一个变量会获得剩余所有的字符。\n```\n\n### read带提示符读取\n\n```bash\n#!/bin/bash\nread -p \"请输入姓名：\" name\necho $name\n```\n\n### read限制10s内输入\n\n```bash\n#!/bin/bash\nread -p \"请输入姓名：\" -t 10 name\necho $name\n```\n\n### read不指定变量\n\n```bash\n#!/bin/bash\nread -p \"请输入姓名：\"\necho $REPLY\n```\n\n### read隐藏输入内容\n\n```bash\nif read -s -t 5 -p \"请输入密码 : \"\nthen\n    echo -n \"status : $? , Ok\" \nelse\n    echo \"等待时间超时！\"\nfi\n```\n\n### read读取至指定字符\n\n```bash\n[root@l1 ~]# read -d q\ngsyuq[root@l1 ~]# echo $REPLY\ngsyu # 可以看到是不包括q字符的\n```\n\n## read读取文件\n\n可以使用read命令读取Linux系统上的文件。每次调用read命令都会读取文件中的\"一行\"文本。当文件没有可读的行时，read命令将以非零状态退出。\n\n读取文件的关键是如何将文本中的数据传送给read命令。最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令。或者可以采用第二种重定向的方式。\n\n```bash\ncat test |  while  read line         //cat 命令的输出作为read命令的输入,read读到的值放在line中\ndo\n    echo  \"Line $count:$line\"\n\tcount=$[ $count +  1  ]           //注意中括号中的空格。\ndone \n```\n\n或者\n\n```bash\nwhile read line\ndo\n\techo  \"Line $count:$line\"\n\tcount=$[ $count +  1  ]\ndone <a.txt //注意重定向一定要写在结尾，而不能写在read line后，否则每次只能无限循环读取第一行数据\n```\n\n","categoryId":5,"viewCount":768,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}