Bash字符串处理(与Java对照) - 5.字符串输入(读取字符串)

Bash字符串处理(与Java对照) - 5.字符串输入(读取字符串)

In Java

Scanner类:Scanner.hasNext() & Scanner.next() & Scanner.hasNextLine() & Scanner.nextLine()

JavaDoc class Scanner 写道
A simple text scanner which can parse primitive types and strings using regular expressions.

A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods.

A scanning operation may block waiting for input.

The next() and hasNext() methods and their primitive-type companion methods (such as nextInt() and hasNextInt()) first skip any input that matches the delimiter pattern, and then attempt to return the next token. Both hasNext and next methods may block waiting for further input. Whether a hasNext method blocks has no connection to whether or not its associated next method will block.
 

下面是关于 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类:System.console() & Console.readLine() & Console.readPassword()

Console类是JDK6加入的,它是对控制台的封装。使用 System.console() 可以获得与当前Java虚拟机关联的控制台,如果有的话。Console.readLine可以读取一行,Console.readPassword可以读取密码。

 

JavaDoc class Console 写道
public final class Console
extends Object
implements Flushable

Methods to access the character-based console device, if any, associated with the current Java virtual machine.

Whether a virtual machine has a console is dependent upon the underlying platform and also upon the manner in which the virtual machine is invoked. If the virtual machine is started from an interactive command line without redirecting the standard input and output streams then its console will exist and will typically be connected to the keyboard and display from which the virtual machine was launched. If the virtual machine is started automatically, for example by a background job scheduler, then it will typically not have a console.

If this virtual machine has a console then it is represented by a unique instance of this class which can be obtained by invoking the System.console() method. If no console device is available then an invocation of that method will return null.

 String     readLine()
          Reads a single line of text from the console.

 char[]     readPassword()
          Reads a password or passphrase from the console with echoing disabled
 

下面是一个关于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

 

In Bash

从标准输入读取

使用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
line. In particular, a backslash-newline pair may not be used as a line continuation.

 

[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
Display prompt on standard error, without a trailing newline, before attempting to read any
input. The prompt is displayed only if input is coming from a terminal.

 

读取密码(输入的字符不回显)

格式: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
read returns after reading nchars characters rather than waiting for a complete line of input.
 

[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
Cause read to time out and return failure if a complete line of input is not read within timeout
seconds. This option has no effect if read is not reading input from the terminal or a pipe.
 

[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.

The code block enclosed in braces may have I/O redirected to and from it.

Unlike a command group within (parentheses), as above, a code block enclosed by {braces} will not normally launch a subshell.
 

 

{ 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 ~]#

 

从Here Document读取

错误: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 ~]#

 

从Here String读取

read VAR <<< "some string"

read VAR <<< "$STR"

 

[root@web ~]# read VAR <<< "some string"
[root@web ~]# echo $VAR
some string
[root@web ~]#

 

 

补充:关于 cat input.txt | read VAR 的问题

先说一下我对管道线的理解:管道线两侧的命令,前一个命令的输出(标准输出),将作为后一个命令的输入(标准输入)。两侧的命令都是在子进程中执行的,都有各自独立的地址空间,子进程会继承(复制)父进程所有的环境变量。子Shell(subshell)是一种特殊的子进程,它会继承(复制)父Shell的所有变量;对于非子Shell进程(外部命令),只有环境变量会被继承(复制)。但是,子进程一旦启动,它所有的变量只在它的进程空间中有效,它对变量的修改都是对自己范围之内的变量的修改,对父进程相同名称的变量是没有影响的。而子进程启动之后,它的父进程对父进程变量的修改,对子进程相同名称的变量也是没有影响的。

Advanced Bash-Scripting Guide: Chapter 3. Special Characters | 写道
|

pipe. Passes the output (stdout) of a previous command to the input (stdin) of the next one, or to the shell. This is a method of chaining commands together.

A pipe, as a classic method of interprocess communication, sends the stdout of one process to the stdin of another. In a typical case, a command, such as cat or echo, pipes a stream of data to a filter, a command that transforms its input for processing.

The output of a command or commands may be piped to a script.

A pipe runs as a child process, and therefore cannot alter script variables.

variable="initial_value"
echo "new_value" | read variable
echo "variable = $variable" # variable = initial_value
 

[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

 

上面的cat input.txt的输出将作为read VAR的输入。
[root@web ~]# cat input.txt | { read VAR; echo $VAR; }
Some text here

可以看到管道线后面的子Shell中确实读到了值。
[root@web ~]# echo $VAR

 

但父Shell中的相同变量不会改变。
[root@web ~]#

 

 

本文链接:http://codingstandards.iteye.com/blog/1170586   (转载请注明出处)

返回目录:Java程序员的Bash实用指南系列之字符串处理(目录) 

上节内容:Bash字符串处理(与Java对照) - 4.字符串输出

下节内容:Bash字符串处理(与Java对照) - 6.判断字符串是否为空(不为空)

 

 

Bash 专业人员笔记 -- 第 12 章:数组 本文摘要介绍了Bash数组的基本操作,包括数组赋值(列表、下标、动态赋值)、访问元素(索引访问、子串操作)、修改数组(追加、插入、删除、合并)、数组迭代(for/while循环)、获取数组长度、关联数组声明与使用(键值对操作)、数组销毁以及从字符串创建数组的方法。适用于Bash 4.0及以上版本,涵盖基础到进阶的数组操作技巧。 阅读详情

相关推荐

Bash脚本教程之字符串操作

目录 字符串的长度 子字符串 搜索和替换 改变大小写 字符串的长度 获取字符串长度的语法如下。 ${#varname} 下面是一个例子。 $ myPath=/home/cam/book/long.file.name $ echo ${#myPath} 29 大括号{}是必需的,否则 Bash 会将$#理解成脚本的参数个数,将变量名理解成文本。 $ echo $#myvar 0myvar 上面例子中,Bash 将$#和myvar分开解释了。 子字符串 字符串提取子..

孙叫兽的博客 1213

bash字符串操作

字符串的长度 获取字符串长度的语法如下。 ${#varname} 下面是一个例子。 $ myPath=/home/cam/book/long.file.name $ echo ${#myPath} 29 大括号{}是必需的,否则 Bash 会将$#理解成脚本的参数个数,将变量名理解成文本。 $ echo $#myvar 0myvar 上面例子中,Bash 将$#和myvar分开解释了。 子字符串 字符串提取子串的语法如下。 ${varname:offset:length}

eli的博客 1938

问题解决:打开VMware创建的虚拟机,电脑立刻蓝屏并重启

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti

weixin_55118477的博客 3万+

shell中取字符串子串的几种方式

<br />(1)awk中函数substr<br /> substr(源字符串,开始索引,长度)   开始索引以0开始<br /> 示例:<br /> awk '{$a=substr($0,0,2);print $a;}' filename<br /> 假设文件中为只有一行为abcdefg,则返回结果为ab<br /><br /> (2)expr substr <br /> expr substr 字符串 开始索引 长度   开始索引以1开始<br /> 示例:<br />expr subst

星星的技术专栏 4万+

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 386

EGE基础入门篇(一):绘图基础知识

EGE绘图所需要了解的相关基础知识

依稀_yixy的博客 2万+

Bash中的字符串截取

看到这样一句脚本 APP_NAME="${0##*[\\/]}"起初不知道什么意思, 后来才发现, 这是在截取文件名. 假如我们的脚本叫test.sh :#!/bin/bashappName="${0##*[\\/]}"echo $appName那么:# 以相对路径运行 [root@localhost Downloads]# ./test.sh test.sh# 以绝对路径运行 [root@lo

开心就好的专栏 3191

修改yolov8使支持单通道图像输入

默认支持BGR三通道图像输入,但是在很多工业场景下,存在很多灰度图像的场景,因此对yolov8代码做一些修改以支持单通道图像输入,满足项目实际需求。训练时,只需要在 data 的 yaml 文件中,添加 ch=1 即可。

mingo_敏 5779

Java程序员的Bash实用指南系列之字符串处理(目录)

Java程序员的Bash实用指南系列之字符串处理(目录) 文章   在一般的计算机编程语言中,字符串处理是很重要的一块,Bash也是如此,如果掌握了字符串的处理,基本上就能够应付大部分的编程工作了。在Unix/Linux操作系统中,很多时候需要使用多个命令一起配合才能完成一个较复杂的任务,Shell提供了管道线、重定向、结构化编程等方式,把这些命令粘合在一起。因此,命令之间的接口数据的处理

Nicholas的专栏 QQ1295794532 1139

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

过了B点后,由于颈缩导致的截面半径迅速减小,导致真应力迅速上升,切线斜率明显提高。假设试样原长为ε,在力的作用下伸长了dε,那么根据应变的定义,瞬时的应变为dε/ε,总的应变为瞬时应变的累计,假设在瞬时的条件下,试样受载荷变化量为 ΔF ,变化的截面积为 ΔA ,而且ΔA→0,那么瞬时的。由于原始的截面积和原始的标距长度为常数,故得到的曲线长相和拉伸力-伸长(延伸)曲线没啥区别。因为用的都是原始的截面积和原始的标距长度,故称为公称应力和公称应变。如果拉伸力→应力,伸长长度→应变,就会得到应力-应变曲线。

m0_73676887的博客 5269

【目标检测-YOLO】YOLOv5-v5.0-yolov5s网络架构详解(第一篇)

源码:GitHub - ultralytics/yolov5 at v5.0 由于YOLO v5 代码库在持续更新,如上图,有多个版本,每个版本的网络结构不尽相同。以下内容以 v5.0 为准,网络结构选用 yolov5s。 为了方便画图和理解网络结构,选用可视化工具:Netron 网页版进行可视化, 然后使用PPT作图。 在Releases · ultralytics/yolov5 · GitHub找到 v5.0中的Assets 中的yolov5s.pt并下载该权重。 下图为直接......

博观约取,厚积薄发 2万+

Bash for 循环示例

循环是任何类型的编程或脚本语言的一个非常重要的部分。与任何其他标准编程一样,循环在 bash 编程中用于执行重复任务。在三种类型的循环(while、do-while、for)中,for 循环对于执行各种类型的迭代任务非常有用。这里显示了“for”循环的基本用法。但“for”循环可用于执行一些高级任务。如果您想了解 for 循环的更多用法,那么您必须阅读本教程。本教程展示了 12 个最有用的“for”循环示例,以了解 bash 中“for”循环的其他具体用法。for 循环在 bash 中可以通过两种方式使用。

木牛的博客 800

支持UE4.27、UE5.0、UE5.1、UE5.2、UE5.3、UE5.4、UE5.5的VS2022一键安装方法

本文提供了两种安装VS2022以支持UE5开发的方案。方案一通过百度网盘提供一键安装包,下载解压后以管理员身份运行批处理文件即可完成安装。方案二需从微软官网下载安装程序,通过创建包含特定参数的批处理文件来自定义安装组件。两种方案都需保持联网环境,建议先卸载旧版VS。安装完成后可测试打包UEC++项目Windows包。

2501_93651177的博客 354

[Bash 学习] 后台运行 java -jar 程序

nohup java -jar xxx.jar >log 2>&1 &

howeres的博客 1012

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 445

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

bash脚本(详解!!!)

bin/bash# 定义函数 greetgreet() {# 调用函数 greet 并传递参数 "World"或者/bin/bash# 定义函数 greet# 调用函数 greet 并传递参数 "World"在这个例子中,greet是一个接受一个参数的函数。当你调用时,它会在屏幕上打印 “Hello, World!结果如下:如果你想要在终端上输入你想要的内容可以加上read 命令/bin/bash# 定义函数 greet# 调用函数 greet 并传递参数 "World"

阿鹏的博客 4973

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux中shell字符串分隔、字符串替换、字符串拼接

1、从properties文件中读取变量 SERVER_NAME=`sed '/project.config/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'` 说明 key=project.config,文件名:conf/dubbo.properties 2、字符串替换 ${变量/查找/替换值} 一个'/'表示替换第一个'//'表示替换所有,...

weixin_30897079的博客 2680

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

bash之流程控制

和 Java、PHP 等语言不一样,sh 的流程控制不可为空在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。

qq_69900890的博客 1870

05 bash脚本编程 变量 bash配置文件 if条件判断 for循环 case语句 while循环 until循环 函数 数组/字符串

脚本定义与分类 变量:命名的内存空间

weixin_43812198的博客 562

Bash语言的网络编程

Bash(Bourne Again SHell)是Unix/Linux系统中的一种命令行解释器及脚本语言。它广泛应用于系统管理、任务自动化及脚本编写。简单易学:Bash语法相对简单,特别适合初学者入门。命令行操作:能够快速执行命令,适合批处理任务。强大的字符串处理能力:可以方便地进行文本操作与数据处理。丰富的命令行工具集成:Bash可以调用众多Unix/Linux命令,极大提高了其功能扩展性。

2501_90494573的博客 466

linux中 bash命令,linux bash shell命令及应用

命令参数bash特殊参数command !$ 执行后!$把上个命令最后的参数作为输入bash shell命令切换目录命令cdcd [目录名] :切换当前目录至dirName (Change the current directory to DIR) 1. cd / 进入系统根目录 2. cd .. 返回上一级目录 3. cd ~ 或cd 当前用户主目录 (注意:“当前用户主目录”和“系统根目录”是...

weixin_42102401的博客 327

Shell 学习(5)Bash 变量

Shell 学习(5)Bash 变量

qq_38074398的博客 272

Linux由用户输入,linux shell获取用户输入

一、获取用户输入1、基本读取read命令接收标准输入的输入,或其它文件描述符的输入。得到输入后,read命令将数据输入放入一个标准变量中。[root@rac2 ~]# cat t8.sh#!/bin/bash#testing the read commandecho -n "enter your name:" ---:-n用于允许用户在字符串后面立即输入数据,而不是在下一行输入。read na...

weixin_39833270的博客 1141

7个高级技巧让Zsh字符串处理效率提升300%

Zsh作为功能强大的Shell环境,在字符串处理方面拥有远超Bash的性能优势。本文面向已经掌握Zsh基础的用户,重点展示如何通过高级字符串处理技巧,让脚本运行速度提升300%以上。Zsh开发指南项目提供了全面的Zsh编程知识,帮助开发者构建高效、可靠的Shell脚本。 ## 问题场景:传统字符串拼接的性能瓶颈 ### 常见问题 在批量处理日志文件时,传统的字符串拼接方法需要频繁调用外部命令,

gitblog_00292的博客 922

Bash语言的Socket编程

Socket 编程是一种网络编程的技术,通过它,程序可以在网络中通过 IP 地址和端口号进行通信。在 Unix/Linux 系统中,Socket 提供了一种灵活的机制来进行不同计算机间的通信。虽然大多数人习惯使用 C、Python、Java 等语言进行 Socket 编程,但实际上,Shell 脚本(尤其是 Bash)也能实现网络通信功能。本文将深入探讨如何使用 Bash 进行 Socket 编程,从基础知识、简单示例到一些实际应用场景。

2501_91048875的博客 630
上一篇: 推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
下一篇: Bash字符串处理(与Java对照) - 6.判断字符串是否为空(不为空)
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值