Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263704
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类:

2010-04-29 23:55:08

使用read来进行变量分配
1 #!/bin/bash
  2 # "Reading" 变量.
  3 
  4 echo -n "Enter the value of variable 'var1': "
  5 # -n 选项, 阻止换行.
  6 
  7 read var1
  8 # 注意: 在var1前面没有'$', 因为变量正在被设置. 
  9 
 10 echo "var1 = $var1"
 11 
 12 
 13 echo
 14 
 15 # 一个单独的'read'语句可以设置多个变量. 
 16 echo -n "Enter the values of variables 'var2' and 'var3' (separated by a space or tab): "
 17 read var2 var3
 18 echo "var2 = $var2      var3 = $var3"
 19 # 如果你只输入了一个值, 那么其他的变量还是处于未设置状态(null). 
 20 
 21 exit 0

一个不带变量参数的read命令, 将会把来自键盘的输入存入到专用变量中.


例子 11-4. 当使用一个不带变量参数的read命令时, 将会发生什么?

1 #!/bin/bash
  2 # read-novar.sh
  3 
  4 echo
  5 
  6 # -------------------------- #
  7 echo -n "Enter a value: "
  8 read var
  9 echo "\"var\" = "$var""
 10 # 到这里为止, 都与期望的一样.
 11 # -------------------------- #
 12 
 13 echo
 14 
 15 # ------------------------------------------------------------------- #
 16 echo -n "Enter another value: "
 17 read           #  没有变量分配给'read'命令, 所以...
 18                #+ 输入将分配给默认变量, $REPLY.
 19 var="$REPLY"
 20 echo "\"var\" = "$var""
 21 # 这部分代码和上边的代码等价.
 22 # ------------------------------------------------------------------- #
 23 
 24 echo
 25 
 26 exit 0

一般的, 当输入给read时, 输入一个\, 然后回车, 将会阻止产生一个新行. -r选项将会让 \ 转义.


例子 11-5. read命令的多行输入

1 #!/bin/bash
  2 
  3 echo
  4 
  5 echo "Enter a string terminated by a \\, then press ."
  6 echo "Then, enter a second string, and again press ."
  7 read var1     # 当 read $var1 时, "\" 将会阻止产生新行. 
  8               #     first line \
  9               #     second line
 10 
 11 echo "var1 = $var1"
 12 #     var1 = first line second line
 13 
 14 #  对于每个以 "\" 结尾的行, 
 15 #+ 你都会看到一个下一行的提示符, 让你继续向var1输入内容.
 16 
 17 echo; echo
 18 
 19 echo "Enter another string terminated by a \\ , then press ."
 20 read -r var2  # -r 选项会让 "\" 转义.
 21               #     first line \
 22 
 23 echo "var2 = $var2"
 24 #     var2 = first line \
 25 
 26 # 第一个  就会结束var2变量的录入.
 27 
 28 echo 
 29 
 30 exit 0

read命令有些有趣的选项, 这些选项允许打印出一个提示符, 然后在不输入ENTER的情况下, 可以读入你所按下的字符的内容.

1 # 不敲回车, 读取一个按键字符.
  2 
  3 read -s -n1 -p "Hit a key " keypress
  4 echo; echo "Keypress was "\"$keypress\""."
  5 
  6 # -s 选项意味着不打印输入.
  7 # -n N 选项意味着只接受N个字符的输入.
  8 # -p 选项意味着在读取输入之前打印出后边的提示符.
  9 
 10 # 使用这些选项是有技巧的, 因为你需要用正确的顺序来使用它们.
 11 

read命令的-n选项也可以检测方向键, 和一些控制按键.


例子 11-6. 检测方向键

1 #!/bin/bash
  2 # arrow-detect.sh: 检测方向键, 和一些非打印字符的按键.
  3 # 感谢, Sandro Magi, 告诉了我们怎么做到这点.
  4 
  5 # --------------------------------------------
  6 # 按键所产生的字符编码.
  7 arrowup='\[A'
  8 arrowdown='\[B'
  9 arrowrt='\[C'
 10 arrowleft='\[D'
 11 insert='\[2'
 12 delete='\[3'
 13 # --------------------------------------------
 14 
 15 SUCCESS=0
 16 OTHER=65
 17 
 18 echo -n "Press a key...  "
 19 # 如果不是上边列表所列出的按键, 可能还是需要按回车. (译者注: 因为一般按键是一个字符)
 20 read -n3 key                      # 读取3个字符.
 21 
 22 echo -n "$key" | grep "$arrowup"  # 检查输入字符是否匹配.
 23 if [ "$?" -eq $SUCCESS ]
 24 then
 25   echo "Up-arrow key pressed."
 26   exit $SUCCESS
 27 fi
 28 
 29 echo -n "$key" | grep "$arrowdown"
 30 if [ "$?" -eq $SUCCESS ]
 31 then
 32   echo "Down-arrow key pressed."
 33   exit $SUCCESS
 34 fi
 35 
 36 echo -n "$key" | grep "$arrowrt"
 37 if [ "$?" -eq $SUCCESS ]
 38 then
 39   echo "Right-arrow key pressed."
 40   exit $SUCCESS
 41 fi
 42 
 43 echo -n "$key" | grep "$arrowleft"
 44 if [ "$?" -eq $SUCCESS ]
 45 then
 46   echo "Left-arrow key pressed."
 47   exit $SUCCESS
 48 fi
 49 
 50 echo -n "$key" | grep "$insert"
 51 if [ "$?" -eq $SUCCESS ]
 52 then
 53   echo "\"Insert\" key pressed."
 54   exit $SUCCESS
 55 fi
 56 
 57 echo -n "$key" | grep "$delete"
 58 if [ "$?" -eq $SUCCESS ]
 59 then
 60   echo "\"Delete\" key pressed."
 61   exit $SUCCESS
 62 fi
 63 
 64 
 65 echo " Some other key pressed."
 66 
 67 exit $OTHER
 68 
 69 #  练习:
 70 #  -----
 71 #  1) 使用'case'结构来代替'if'结构, 
 72 #+    这样可以简化这个脚本.
 73 #  2) 添加 "Home", "End", "PgUp", 和 "PgDn" 这些按键的检查.

Note

对于read命令来说, -n选项不会检测ENTER(新行)键.

read命令的-t选项允许时间输入(参考).

read命令也可以从的文件中"读取"变量的值. 如果文件中的内容超过一行, 那么只有第一行被分配到这个变量中. 如果read命令的参数个数超过一个, 那么每个变量都会从文件中取得一个分配的字符串作为变量的值, 这些字符串都是以来进行分隔的. 小心使用!


例子 11-7. 通过来使用read命令

1 #!/bin/bash
  2 
  3 read var1 

Note

输出到read命令中, 使用管道输出来设置变量.

然而, 使用管道输出看起来能够正常运行.

1 cat file1 file2 |
  2 while read line
  3 do
  4 echo $line
  5 done

但是, 就像Bj鰊 Eriksson所指出的:


例子 11-8. 管道输出到read中的问题

1 #!/bin/sh
  2 # readpipe.sh
  3 # 这个例子是由Bjon Eriksson所编写的.
  4 
  5 last="(null)"
  6 cat $0 |
  7 while read line
  8 do
  9     echo "{$line}"
 10     last=$line
 11 done
 12 printf "\nAll done, last:$last\n"
 13 
 14 exit 0  # 代码结束.
 15         # 下边是脚本的(部分)输出.
 16         # 'echo'出了多余的大括号.
 17 
 18 #############################################
 19 
 20 ./readpipe.sh 
 21 
 22 {#!/bin/sh}
 23 {last="(null)"}
 24 {cat $0 |}
 25 {while read line}
 26 {do}
 27 {echo "{$line}"}
 28 {last=$line}
 29 {done}
 30 {printf "nAll done, last:$lastn"}
 31 
 32 
 33 All done, last:(null)
 34 
 35 变量(last)被设置在子shell中, 并没有被设置在外边.

在许多Linux发行版上, gendiff脚本通常都在/usr/bin下, 将的输出通过管道传到while read结构中.

1 find $1 \( -name "*$2" -o -name ".*$2" \) -print |
  2 while read f; do
  3 . . .

阅读(2529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~