Shell中Read用法简介

Shell中Read用法简介

2023年7月10日发(作者:)

Shell中Read用法简介

一. read读取单个词.

$read name

$tony ma

$echo $name

tony ma

$read id passwd

$allen passwd

$echo $id

$allen

$echo $passwd

$passwd

$read id passwd

$allen kaka gogo

$echo $id

$allen

$echo $passwd

$kaka gogo

二. read读取整行.

利用while循环来使read读取整行。

以下是代码清单:

1 #!/bin/bash

2 lineno=1

3 cat $* |

4 while read -r line

5 do

6 echo "$lineno: $line"

7 lineno=$((lineno + 1))

8 done

三. read的嵌套.

1)while外层的read依次读取的是文件pbook中的每一行,而内层的read是从console读取的内容。

2)要实现while read的嵌套,可以使用exec命令,将I/O重定向。 注意exec的用法,以及括号的使用。

1 #!/bin/bash

2 echo -n "Enter name to be removed: "

3 read name

4 p=$(grep "$name " phonebook | wc -l)

5 echo $p

6 if [ "$p" -gt 1 ]

7 then

8 echo "More than one match ; Please select the one to remove;"

9 grep "$name " phonebook > pbook

10 cat pbook | while read line

11 do(

12 echo -n "$line Remove(y/n)?"

13 exec < /dev/tty

14 read answer

15 if [ "$answer" = y ]

16 then

17 grep -v "^$line$" phonebook > /tmp/

18 mv /tmp/ phonebook

19 else

20 continue

21 fi

22 )

23 done

24 else

25 grep -v "^$line$" phonebook > /tmp/

26 mv /tmp/ phonebook

27 fi

28 cat phonebook

shell中read参数

2011-09-29 17:52

关键字:获取用户输入echo -n(不换行)

read命令-p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 和“读文件”深入学习

1、基本读取

read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说)。得到输入后,read命令将数据放入一个标准变量中。下面是read命令

的最简单形式:: #!/bin/bash

echo -n "Enter your name:" //参数-n的作用是不换行,echo默认是换行

read name //从键盘输入

echo "hello $name,welcome to my program" //显示信息

exit 0 //退出shell程序。

//********************************

由于read命令提供了-p参数,允许在read命令行中直接指定一个提示。

所以上面的脚本可以简写成下面的脚本::

#!/bin/bash

read -p "Enter your name:" name

echo "hello $name, welcome to my program"

exit 0

在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给第一个变量。如果太少输入不会结束。

//*****************************************

在read命令行中也可以不指定变量.如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中。

例如::

read -p "Enter a number"

环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY.

2、计时输入.

使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。 -t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态;

#!/bin/bash

if read -t 5 -p "please enter your name:" name

then

echo "hello $name ,welcome to my script"

else

echo "sorry,too slow"

fi

exit 0

除了输入时间计时,还可以设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

#!/bin/bash

read -n1 -p "Do you want to continue [Y/N]?" answer

case $answer in

Y | y)

echo "fine ,continue";;

N | n)

echo "ok,good bye";;

*)

echo "error choice";;

esac

exit 0

该例子使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即 接受输入并将其传给变量。无需按回车键。

3、默读(输入不显示在监视器上)

有时会需要脚本用户输入,但不希望输入的数据显示在监视器上。典型的例子就是输入密码,当然还有很多其他需要隐藏的数据。

-s选项能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)。

#!/bin/bash

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

echo "your password is $pass"

exit 0

4、读文件

最后,还可以使用read命令读取Linux系统上的文件。

每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。

读取文件的关键是如何将文本中的数据传送给read命令。

最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

例子::

#!/bin/bash

count=1 //赋值语句,不加空格

cat test | while read line //cat 命令的输出作为read命令的输入,read读到的值放在line中

do

echo "Line $count:$line" count=$[ $count + 1 ] //注意中括号中的空格。

done

echo "finish"

exit 0

shell脚本中read的使用

2011-07-08 15:55

转载自 分享

最终编辑 chichushanren

对于写bash脚本的朋友,read命令是不可或缺的,需要实践一下就可以了解read命令的大致用途:

编写一个脚本:

#!/bin/bash

# hao32 test read

echo -e "Please enter your test :"

read TESTREAD

echo $TESTREAD

试着运行下这个脚本,你就可以大致了解read命令的用法,下面是转载一篇read命令详细的用法,大家参考参考啊,呵呵

作用

从标准输入中读取一行。

语法

read [ -p ][ -r ][ -s ][ -u[ n ] ] [ VariableName?Prompt ]

[ VariableName ... ]

描述

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。VariableName 参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值。由VariableName 参数指定的第一个 shell 变量指定给每一个字段的值,由 VariableName 参数指定的第二个 shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由

VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。

注意: 如果省略了 VariableName 参数,变量 REPLY 用作缺省变量名。

由 read 命令设置的 shell 变量影响当前 shell 执行环境。 标志

-p 用 |& (管道,& 的记号名称)读取由 Korn shell 运行的进程的输出作为输入。

注:-p 标志的文件结束符引起该进程的清除,因此产生另外一个进程。

-r 指定读取命令把一个 (反斜杠) 处理为输入行的一部分,而不把它作为一个控制字符。

-s 把输入作为一个命令保存在 Korn shell 的历史记录文件中。

-u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误。

参数

VariableName?Prompt 指定一个变量的名称和一个要使用的提示符。当 Korn shell 是交互式时,它将把提示符写到标准错误,并执行输入。Prompt 包含多于一个的字,必须用单引号或双引号括起来。

< 指定一个或多个由空格分隔的变量名。

退出状态

这个命令返回下列出口值:

0 成功完成。

>0 检测到文件结束符或一个错误发生。

示例

下列脚本打印一个文件,这个文件中每行的第一个字段被移动到本行的末尾。

while read -r xx yy

do

print printf "%s %s/n" $yy $xx

done < InputFile读取一行,把它分成字段,并使用 "Please enter: " 作为提示符,请输入:

read word1?"Please enter: " word2系统显示:

Please enter:

You enter:

hello world变量 word1 的值应该是 "hello",变量 word2 应该是 "world."

为创建一个共同进程,用 print -p 写到共同进程,并用 read -p 从共同进程中读取输入,请输入:

(read; print "hello $REPLY")

print -p "world"

read-p line变量 line 的值应该是 "hello world."

为把输入行的副本保存为历史文件中的一个命令,请输入:

read -s line < input_file如果输入文件包含 "echo hello world," ,那么在历史记录文件中将会把 "echo hello world" 保存为一个命令。

shell之输入和输出(echo,read,cat,管道,tee,重定向等)

2010-07-06 09:19

输入和输出(echo,read,cat,管道,tee,重定向等)

我下面的所有环境都在在REDHAT LINUX9下试验的

在LINUX中,要使转义符生效,需加参数-e

从echo的变量开始说起

如:e c h o命令输出转义符以及变量。

代码:

# echo -e "007your home is $HOME , you are connected on `tty`"

your home is /root , you are connected on /dev/pts/1

# echo -e "ayour home is $HOME , you are connected on `tty`"

your home is /root , you are connected on /dev/pts/1

#

引用:

本例中

007或a你可以让终端铃响一声

显示出$ H O M E目录,

并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号 )。

在e c h o命令输出之后附加换行,可以使用 n选项:

代码:

$ cat echod

#!/bin/sh

echo -e "this echo's 3 new linesnnn"

echo "OK"

编辑一个新echod,如上内容,然后运行输出如下:

代码:

$ ./echod this echo's 3 new lines

OK

$

在e c h o语句中使用跳格符,记住别忘了加反斜杠:

代码:

$ echo -e "here is a tabthere are two tabsttok"

here is a tab here are two tabs ok

$

把一个字符串输出到文件中,使用重定向符号>。

在下面的例子中一个字符串被重定向到一个名为m y f i l e的文件中:

代码:

$ echo "The log files have all been done"> myfile

或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:

代码:

$ echo "$LOGNAME carried them out at `date`">>myfile

现在让我们看一下m y f i l e文件中的内容:

引用:

The log files have all been done

sam carried them out at 六 11月 13 12:54:32 CST 2004

引号是一个特殊字符,所以必须要使用反斜杠来使s h e l l忽略它的特殊含义。

假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠即可:

代码:

$ echo ""/dev/rmt0""

"/dev/rmt0"

$

其它用法: --〉'echo'用法收集

/forum/?t=424904

ANSI控制码

/forum/?t=207837&highlight=%B7%C9%BB%D2%B3%C8

_________________

cat:显示文件内容,创建文件,还可以用它来显示控制字符。

注意:在文件分页符处不会停下来;会一下显示完整个文件。因此,可以使用m o r e命令或把c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,使用命令less

file可实现相同的功能。

如下形式

代码:

$ cat myfile | more

$ cat myfile | pg

c a t命令的一般形式为:

代码:

cat [options] filename1 ... filename2 ...

1、显示名为m y f i l e的文件:

代码:

$ cat myfile

2、显示m y f i l e 1、m y f i l e 2、m y f i l e 3这三个文件,可以用:

代码:

$ cat myfile1 myfile2 myfile3

3、创建一个包含上述三个文件的内容,名为b i g f i l e的文件,可以用输出重定向到新文件中: 代码:

$ cat myfile1 myfile2 myfile3 > bigfile

4、如果cat的命令行中没有参数,输入的每一行都立刻被cat命令输出到屏幕上,输入完毕后按< C T R L - D >结束

代码:

$ cat

Hello world

Hello world

$

5、新建文件

代码:

$cat >myfile

This is great

$cat myfile

This is great

cat:参数选项

使用方式:

代码:

cat [-AbeEnstTuv] [--help] [--version] fileName

说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)

参数:

引用:

-n 或 --number 由 1 开始对所有输出的行数编号

-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号

-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -v 或 --show-nonprinting 显示非打印字符

例:

显示时加上行号

代码:

$cp /etc/httpd/conf/httpd /usr/sam

$ cat -n

把 的内容加上行号后输入 这个文件里

代码:

$cat -n >

对文件加上行号(空白不加)后显示

代码:

$ cat -b

把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到

textfile3 里。

代码:

$ cat -b textfile1 textfile2 >> textfile3

清空/etc/档案内容

代码:

$cat /dev/null > /etc/

使用 sed 与 cat 除去空白行

代码:

$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d'

-s项我试了一下,不成功,不知是不是用错了

其它参数来自:(这个我没试) /forum/?t=438463&highlight=cat

cat 还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。您可以用以下选项来显示制表符:

引用:

* -T 将制表符显示为 ^I

* -v 显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。例如,当您处理一个在 Windows 系统中生成的文件时,这个文件将使用 Control-M(^M)来标记行的结束。对于代码大于 127 的字符,它们的前面将会被加上 M-(表示“meta”),这与其它系统中在字符前面加上 Alt- 相当。

* -E 在每一行的结束处添加美元符($)。

显示非打印字符

代码:

$ cat -t /etc/X11/XF86Config

...

# Multiple FontPath entries are allowed (they are concatenated together)

# By default, Red Hat 6.0 and later now use a font server independent of

# the X server to render fonts.

^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType"

^IFontPath^I"unix/:7100"

EndSection

...

代码:

$ cat -E /etc/X11/XF86Config

...

# Multiple FontPath entries are allowed (they are concatenated together)$

# By default, Red Hat 6.0 and later now use a font server independent of$

# the X server to render fonts.$

$

FontPath "/usr/X11R6/lib/X11/fonts/TrueType"$

FontPath "unix/:7100"$

$

EndSection$

...

代码: $ cat -v /etc/X11/XF86Config

...

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@

P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@

@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@

M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@

F^@^@ ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^?

^IM-A5^@^@^D^@PM-^]M-^X1M-H%^@^@^D^@tyM-G

...

_________________

寂寞烈火 写到:

cat我常用:

cat file

cat -A file

别的基本不用

cat -n 应该还可以吧

tee:读取标准输入的数据,并将其内容输出成文件。

语 法:tee [-ai][--help][--version][文件„]

补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。

参 数:-a 附加到既有文件的面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数,数据会新增在该文件内容的最面,而不会删除原先之内容。

-i 忽略中断信号

--help 在线帮助

--version 显示版本信息

例一:

列出文本文件的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3:

代码:

$ cat |tee ss-copy1 ss-copy2 ss-copy3 例一: 把列出当前目录,并把结果结到myfile里

代码:

$ls -l |tee myfile

管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:

代码:

命令1 |命令2

其中|是管道符号。

上例就是

_________________

标准输入、输出和错误

当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。

下面就是这些文件描述符及它们通常所对应的文件名:

引用:

文件文件描述符

输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。

输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。

错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。

如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。

在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。表5 - 1列出了最常用的重定向组合,并给出了相应的文件描述符。

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。

代码:

常用文件重定向命令

command > filename 把把标准输出重定向到一个新文件中

command >> filename 把把标准输出重定向到一个文件中(追加)

command 1 > fielname 把把标准输出重定向到一个文件中

command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中

command 2 > filename 把把标准错误重定向到一个文件中

command 2 >> filename 把把标准输出重定向到一个文件中(追加)

command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)

command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件

作为标准输出

command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入

command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符

command <&m 把把文件描述符m作为标准输入

command >&m 把把标准输出重定向到文件描述符m中

command <&- 把关闭标准输入

[shell日记]read

2010-01-06 19:21

[shell日记]read

文:523066680

今天第一篇。

算是一种笔记吧,就像流水帐一样

算不上分享,因为每个人都会经历自己探索的过程。

顺便学英语,就把原帮助一起拉上来

参数和对应实例:

-a array assign the words read to sequential indices of the array

variable ARRAY, starting at zero

把输入内容按分隔符(空格或者跳格之类)分配给数组,连续的空格也算为1个分割。

输入后,数组规格跟c语言一样,用var[n]的格式表示,下标从0开始,

直接echo $var 的效果等于echo ${var[0]}

当echo 数组带下标的时候,记得加{}表达,比如echo ${a[1]}

定义数组变量: read -a arr 就可以了; read -a arr[1] 出错。 但是你直接 read arr[1] 是允许的,就是直接赋值数组某个元素嘛。

-d delim continue until the first character of DELIM is read, rather

than newline

就是读取输入,直到某个字符出现为止,而不是转行结束。当然,“某个字符”不算进去。

测试结果:

1, 指定是某个字符后,回车也被读进去,而不会因回车结束

(嘿嘿,没试过该参数以回车字符结束,不会弄+多余)

2, -dstr 不会到 str结束,是s结束,所以人家才说是character

3, -dx str ;# 转了n行+输入字符 ; echo $str 并不会把转行输出来

要echo "$str" 才会转行。

(以下不知道的都直接引用help内容)

-e use Readline to obtain the line in an interactive shell

是说读取一行就结束? 好像是默认的

-i text Use TEXT as the initial text for Readline

-n nchars return after reading NCHARS characters rather than waiting

for a newline

rather than 在这里指:而不是。

读取到了第N个字符就结束~ 而不是等待一个新的行。

结果按回车将提前结束了 [ 感觉没有-d 那么严,还说nchars]

感觉描述的不严密, 实际规则是{ 如果 转行||字符数为n ;则 结束 }

(这个参数的help一度让我以为rather than是或者的意思)

-p prompt prompt就是提示的意思,就是先显示"prompt"字符串,在后面等待你输入。

有提示选项就不用另外echo提示啦。

-r do not allow backslashes to escape any characters

backslash 反斜杠 "";

escape 逃脱;在这里指:转义

翻译:不允许反斜杠来转义任何字符。

-s do not echo input coming from a terminal

不显示正在从终端输入的字符。(就像输入密码时),

"s"跟这功能什么联系?记住它就像背书一样。

-t timeout

time out and return failure if a complete line of input is

not read withint TIMEOUT seconds.

如果在 timeout 秒内还没输入完毕(触发终止输入条件),就超时退出 + 命令会返回一个

错误码。[不会真的提示错误,是返回错误代码。 echo $? ;我看到错误代号为 142]

The value of the TMOUT variable is the default timeout.

这句话没看出来,不过执行TMOUT=1, 命令行1秒后就退出了

TIMEOUT may be a fractional number.

设置值可以是一个分数[fractional number],当然并不是真的用分数表示法

他是告诉你,可以使用一个非整数,比如 -t0.5 就是限制半秒内输入。

If TIMEOUT is 0, read returns success only if input is available

on the specified file descriptor.

如果设timeout为0,则仅当 从有效的特殊文件描述中输入 时返回成功。[不懂]

The exit status is greater than 128 if the timeout is exceeded

[exceed: 超出] 如果超时,退出状态[退出代码]就大于128。

-u fd read from file descriptor FD instead of the standard input

不说了,都不知道fd是什么,

相关资料:/view/

“linux下,所有的操作都是对文件进行操作,而对文件的操作是利用文件描述符

(file descriptor)来实现的。在源代码中,一般用fd作为文件描述符的标识。”

# 仍然不知道几个参数的含义,所以以后知道了会回来修改的„„ #

终: read 后面不加变量名,会把值赋给REPLY这个变量,

但是,如果你给了一个新的变量名,REPLY不会同步更新。

+++++++++++++++++学点英语+++++++++++++

#1 -e use Readline to obtain the line in an interactive shell

百度搜索:

obtain 获得;得到

实例: He failed to obtain a scholarship. 他没有获得奖学金。

interactive 互相作用的;交互式的

#2 -n nchars return after reading NCHARS characters rather than waiting

for a newline

rather than : 而不是

#3 -t timeout time out and return [failure] if a complete line of input is

not read withint TIMEOUT seconds. The value of the TMOUT

variable is the default timeout. TIMEOUT may be a

[fractional] number. If TIMEOUT is 0, read returns success only

if input is available on the specified file descriptor. The

exit status is greater than 128 if the timeout is [exceeded]

failure n. 失败

He was doomed to failure. 他注定失败

fractional 形容词:小量的;分数的

exceed 超过

shell编程exec和read结合读取文件

2009-10-10 21:46

exec < infile 默认赋值给lib库中的文件描述符0

exec > outfile 默认从lib库中的文件描述符1输出

exec > outfile 2> errfile 将2描述符erro信息输出到文件errfile

exec 3

$ read line1 < names; echo $line1; read line2 < names; echo $line2

Alice Jones

Alice Jones

$ (read line1; echo $line1; read line2; echo $line2) < names

Alice Jones

Robert Smith

$ exec 3< names

$ read -u3 line1; echo $line1; read -u3 line2; echo $line2

Alice Jones

Robert Smith

$ exec 3<&-

$ to_screen1 > out 2> err

message to the user

$ cat out

message to standard output

$ cat err

luther@gliethttp:~$ exec 9<&0

$tab2 ; echo $tab3 ; read line ; echo $line ; exec 0<&- 0<&9

Help

on

module struct:

NAME

luther@gliethttp:~$ cat struct.c

Help on module struct:

NAME

struct

FILE

/usr/lib/python2.5/

MODULE DOCS

/doc/current/lib/

所以read可以根据tab,空格等来进一步细分,读取一行中的某几个域,这在ubuntu7.10的/lib/init/是一个很好的学习范例.

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688986234a191812.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信