下面是关于 Scanner.hasNext() 和 Scanner.next() 的例子,用于读取以空白分隔的标识符。
Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String msg = scanner.next(); System.out.println(msg); }
?
下面是关于 Scanner.hasNextLine() 和 Scanner.nextLine() 的例子,用于读取输入数据行。
Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String msg = scanner.nextLine(); System.out.println(msg); }
?
更详细的说明请参考:http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html
?
Console类是JDK6加入的,它是对控制台的封装。使用 System.console() 可以获得与当前Java虚拟机关联的控制台,如果有的话。Console.readLine可以读取一行,Console.readPassword可以读取密码。
?
JavaDoc class Console 写道 public final class Console下面是一个关于Console的示例代码:
?
Console console = System.console(); // 获得Console实例对象 if (console != null) { // 判断是否有控制台的使用权 String user = new String(console.readLine("Enter username:")); // 读取整行字符 String pwd = new String(console.readPassword("Enter passowrd:")); // 读取密码,输入时不显示 console.printf("Username is: " + user + "\n"); // 显示用户名 console.printf("Password is: " + pwd + "\n"); // 显示密码 } else { System.out.println("Console is unavailable."); // 提示无控制台使用权限 }?
更详细的说明请参考:·http://download.oracle.com/javase/6/docs/api/java/io/Console.html
?
使用read命令读取字符串到变量中。但是,如果有反斜杠,将起到转义的作用。\\表示一个\号,\<newline>表示续行,\<char>代表<char>本身。
格式:read VAR
格式:read -p <prompt> VAR
?
[root@node56 ~]# read VAR
hello world
[root@node56 ~]# echo $VAR
hello world
[root@node56 ~]# read -p "Input your number: " VAR
Input your number: 123
[root@node56 ~]# echo $VAR
123
[root@node56 ~]# read VAR
yes\tno
[root@node56 ~]# echo $VAR
yestno
[root@node56 ~]#
?
?
读取一行文本,但是取消反斜杠的转义作用。
格式:read -r VAR
格式:read -p <prompt> -r VAR
man bash: read 写道 -r Backslash does not act as an escape character. The backslash is considered to be part of the?
[root@node56 ~]# read -r VAR
yes\tno
[root@node56 ~]# echo $VAR?
yes\tno
[root@node56 ~]#
?
关于read -p
此参数用于在读取变量之前显示提示信息。如果输入重定向了,就不会显示,比如重定向从文件中读取。
也就是说,read -p PROMPT VAR 不等同于 echo PROMPT; read VAR 的组合。
man bash: read 写道 -p prompt?
格式:read -s PASSWORD
格式:read -p <prompt> -s PASSWORD
man bash: read 写道 -s Silent mode. If input is coming from a terminal, characters are not echoed. ?[root@node56 ~]# echo $PASSWORD
[root@node56 ~]# read -s PASSWORD
[root@node56 ~]# echo $PASSWORD?
12345
[root@node56 ~]# read -p "Input password: " -s PASSWORD
Input password:
[root@node56 ~]# echo $PASSWORD?
54321
?
格式:read -n <nchars> VAR
格式:read -p <prompt> -n <nchars> VAR
man bash: read 写道 -n nchars[root@node56 ~]# read -p "Input two chars: " -n 2 VAR
Input two chars: 12
[root@node56 ~]# echo $VAR
12
[root@node56 ~]#
?
格式:read -t <seconds> VAR
格式:read -p <prompt> -t <seconds> VAR
?
man bash: read 写道 -t timeout[root@node56 ~]# read -p "Input some words in 5 seconds: " -t 5 VAR
Input some words in 5 seconds: [root@node56 ~]#
?
格式:read VAR <file.txt
对于read命令,可以指定-r参数,避免\转义。
格式:read -r VAR <file.txt
错误:cat file.txt | read VAR??? (此处read命令将会在子进程中执行,子进程无法更改父进程的变量)
?
[root@web ~]# cat input.txt
Some text here
with backslash \ here
dollar $HOME meet
[root@web ~]# cat input.txt | read VAR
[root@web ~]# echo $VAR
[root@web ~]# read VAR <input.txt
[root@web ~]# echo $VAR
Some text here
[root@web ~]# read VAR1 VAR2 VAR3 VAR4<input.txt
[root@web ~]# echo "VAR1=$VAR1 VAR2=$VAR2 VAR3=$VAR3 VAR4=$VAR4"
VAR1=Some VAR2=text VAR3=here VAR4=
[root@web ~]# read VAR1 VAR2<input.txt
[root@web ~]# echo "VAR1=$VAR1 VAR2=$VAR2"
VAR1=Some VAR2=text here
[root@web ~]#
上面的直接对read命令输入重定向,只能读取输入文件中的一行。
?
如果需要读取整个文件,最好将其写在一个代码块中。
Advanced Bash-Scripting Guide: Chapter 3. Special Characters {} 写道 Block of code [curly brackets]. Also referred to as an inline group, this construct, in effect, creates an anonymous function (a function without a name). However, unlike in a "standard" function, the variables inside a code block remain visible to the remainder of the script.?
{ read LINE1; read LINE2; read LINE3; } <input.txt
注意每个read命令之后都要以分号结束。
?
[root@web ~]# { read LINE1; read LINE2; read LINE3; } <input.txt
[root@web ~]# echo $LINE1
Some text here
[root@web ~]# echo $LINE2
with backslash here
[root@web ~]# echo $LINE3
dollar $HOME meet
[root@web ~]#
上面LINE2中\ 没有读取出来,因为在没有加上-r参数时,read会转义。
?
现在加上-r参数来测试一下。
{ read -r LINE1; read -r LINE2; read -r LINE3; } <input.txt
?
[root@web ~]# { read -r LINE1; read -r LINE2; read -r LINE3; } <input.txt
[root@web ~]# echo $LINE1
Some text here
[root@web ~]# echo $LINE2
with backslash \ here
[root@web ~]# echo $LINE3
dollar $HOME meet
[root@web ~]#
?
错误:read VAR <<EOF
some string
EOF
正确:{ read VAR; } <<EOF
some string
EOF
问题:为什么写在代码块中才能读取呢?
?
[root@web ~]# read VAR <<EOF
> some string
> EOF
[root@web ~]# echo "$VAR"
[root@web ~]# { read VAR; } <<EOF
> hello
> EOF
[root@web ~]# echo "$VAR"
???????
hello
[root@web ~]#
?
read VAR <<< "some string"
read VAR <<< "$STR"
?
[root@web ~]# read VAR <<< "some string"
[root@web ~]# echo $VAR
some string
[root@web ~]#
?
?
本文链接:http://codingstandards.iteye.com/blog/1170586 ? (转载请注明出处)
返回目录:Java程序员的Bash实用指南系列之字符串处理(目录)?
上节内容:Bash字符串处理(与Java对照) - 4.字符串输出
下节内容:Bash字符串处理(与Java对照) - 6.判断字符串是否为空(不为空)
?
?