`

Bash字符串处理(与Java对照) - 4.字符串输出

阅读更多

Bash字符串处理(与Java对照) - 4.字符串输出

In Java

输出到标准输出设备(控制台、屏幕)

System.out.println(s);

 

输出到标准错误设备(控制台、屏幕)

System.err.println(s);

 

输出到文件

PrintWriter outputStream = new PrintWriter(new FileWriter("output_file.txt"));

try {

    outputStream.println(s);

} finally {  // 别忘记将输出流关闭,否则会造成资源泄漏

    outputStream.close();

}

 

Line-Oriented I/O (来自 http://download.oracle.com/javase/tutorial/essential/io/charstreams.html)

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;

public class CopyLines {
    public static void main(String[] args) throws IOException {
        BufferedReader inputStream = null;
        PrintWriter outputStream = null;

        try {
            inputStream = 
                new BufferedReader(new FileReader("xanadu.txt"));
            outputStream = 
                new PrintWriter(new FileWriter("characteroutput.txt"));

            String l;
            while ((l = inputStream.readLine()) != null) {
                outputStream.println(l);
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}
 

In Bash

echo

关于echo命令,也可以参考“我使用过的Linux命令之echo - 显示文本、打印信息 ”。

 

输出字符串常量

示例:echo Hello

示例:echo "Hello"

 

[root@jfht tmp]# echo Hello
Hello
[root@jfht tmp]# echo "Hello"
Hello
[root@jfht tmp]# echo Hello   World
Hello World
[root@jfht tmp]# echo "Hello   World"
Hello   World
[root@jfht tmp]#

 

 

输出变量

格式1:echo $VAR

格式2:echo ${VAR}

上面的格式,如果变量VAR保存的字符串中包含空格、换行,那么这些空格、跳格、换行将会被压缩掉。

格式3:echo "$VAR"

格式4:echo "${VAR}"

注意,不能用单引号来引用。

 

[root@jfht tmp]# VAR=" Hello    World   "
[root@jfht tmp]# echo $VAR
Hello World
[root@jfht tmp]# echo ${VAR}
Hello World
[root@jfht tmp]# echo "$VAR"
 Hello    World  
[root@jfht tmp]# echo "${VAR}"
 Hello    World  
[root@jfht tmp]# echo '$VAR'
$VAR
[root@jfht tmp]# echo $'$VAR'
$VAR
[root@jfht tmp]#

 

 

注意:echo在输出信息的时候会自动加上换行,

如果不需要换行,加上 -n参数即可

man echo 写道
-n do not output the trailing newline

 

[root@jfht tmp]# echo "Hello"
Hello
[root@jfht tmp]# echo -n "Hello"
Hello[root@jfht tmp]#

 

echo -e 命令参数中的转义字符

man echo 写道
       -e enable interpretation of backslash escapes

       If -e is in effect, the following sequences are recognized:

       \0NNN  the character whose ASCII code is NNN (octal)
       \\     backslash
       \a     alert (BEL)
       \b     backspace
       \c     suppress trailing newline
       \f     form feed
       \n     new line
       \r     carriage return
       \t     horizontal tab
       \v     vertical tab

       NOTE: your shell may have its own version of echo, which usually supersedes the version described here.  Please
       refer to your shell’s documentation for details about the options it supports.
 

\"  双引号 gives the quote its literal meaning
\$  美元符 gives the dollar sign its literal meaning (variable name following \$ will not be referenced)
\\  反斜杠、转义符本身 gives the backslash its literal meaning

\` 反引号

\<newline> 就是\跟上换行,那么换行的作用不再有,只起到续行的作用。

\n  换行 means newline
\r  回车 means return
\t  制表符,跳格 means tab
\v  竖制表符 means vertical tab
\b  退格 means backspace
\a  警报 means alert (beep or flash)
\0xx  八进制表示的ASCII码字符 translates to the octal ASCII equivalent of 0nn, where nn is a string of digits

 

[root@jfht ~]# echo -e '\n'


[root@jfht ~]# echo -e 'a\tb'
a       b
[root@jfht ~]#

 

 

输出命令执行结果

格式1:command line

就是直接执行命令,当然可以

格式2:echo `command line`

格式3:echo $(command line)

这两种格式的执行效果是一样的,都会把命令输出的前后空格去掉、中间的空格换行压缩为一个空格。

格式2:echo "$(command line)"

格式3:echo "`command line`"

这两种格式的执行效果也是一样的,并且会保持命令输出的空格和换行。一般与直接执行命令的输出一致。

 

 

[root@jfht tmp]# ls
ct08  ct08.min.tar.gz  ls0.txt  ls1.txt  ls2.txt
[root@jfht tmp]# echo `ls`
ct08 ct08.min.tar.gz ls0.txt ls1.txt ls2.txt
[root@jfht tmp]# echo $(ls)
ct08 ct08.min.tar.gz ls0.txt ls1.txt ls2.txt
[root@jfht tmp]# echo "`ls`"
ct08
ct08.min.tar.gz
ls0.txt
ls1.txt
ls2.txt
[root@jfht tmp]# echo "$(ls)"
ct08
ct08.min.tar.gz
ls0.txt
ls1.txt
ls2.txt
[root@jfht tmp]#

问题来了:为什么 echo "`ls`" 和 echo "$(ls)" 的输出结果与 直接执行 ls 不一致呢?可以看看下面的解释:

如果标准输出是终端,那么是显示为多列形式的;否则就是一行一列。而对于$(ls)和`ls`,实际上标准输出已经不是终端了。

info ls 写道
By default, the output is sorted alphabetically, according to the
locale settings in effect.(1) If standard output is a terminal, the
output is in columns (sorted vertically) and control characters are
output as question marks; otherwise, the output is listed one per line
and control characters are output as-is.
 

 

输出到文件(标准输出重定向)

覆盖原来的文件

格式:echo "$S" >output.txt

 

追加到文件

格式:echo "$S" >>output.txt

 

[root@jfht tmp]# S=123456789
[root@jfht tmp]# echo "$S" >output.txt 
[root@jfht tmp]# cat output.txt
123456789
[root@jfht tmp]# echo "$S" >output.txt
[root@jfht tmp]# cat output.txt      
123456789
[root@jfht tmp]# echo "$S" >>output.txt
[root@jfht tmp]# cat output.txt       
123456789
123456789
[root@jfht tmp]#

 

输出到标准错误设备

比如用来打印程序的出错信息

echo "$S" >&2

>&2表示把标准输出重定向到文件描述符2,而这正是标准错误输出的文件描述符。

 

[root@jfht tmp]# if ! ls "*"; then echo "error ls" >&2; fi
ls: *: 没有那个文件或目录
error ls
[root@jfht tmp]#

上面命令行的意思是说列出文件名为*的文件,如果出错,就打印错误信息。

 

输出到别的进程

管道线(|)

示例:echo "$S" | wc -c

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.
 

Here Document方式

示例:wc -c <<EOF

$S

EOF

Advanced Bash-Scripting Guide: Chapter 19. Here Documents 写道
A here document is a special-purpose code block. It uses a form of I/O redirection to feed a command list to an interactive program or a command, such as ftp, cat, or the ex text editor.

COMMAND <<InputComesFromHERE
...
...
...
InputComesFromHERE

A here document supports parameter and command substitution. It is therefore possible to pass different parameters to the body of the here document, changing its output accordingly.
 

 

Here String方式

示例:wc -c <<<"$S"

Advanced Bash-Scripting Guide: 19.1. Here Strings 写道
A here string can be considered as a stripped-down form of a here document.
It consists of nothing more than COMMAND <<< $WORD,
where $WORD is expanded and fed to the stdin of COMMAND.
 

 

[root@jfht tmp]# S=123456789
[root@jfht tmp]# echo "$S" | wc -c
10
[root@jfht tmp]# wc -c <<<"$S"
10
[root@jfht tmp]# wc -c <<EOF
> $S
> EOF
10
[root@jfht tmp]#

 

格式化输出(printf)

printf "%8s" "$S"

类似C语言的格式化输出,此处不深入探讨。将在本系列的第18节详述。

 

 

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

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

上节内容:Bash字符串处理(与Java对照) - 3.给(字符串)变量赋值

下节内容:Bash字符串处理(与Java对照) - 5.字符串输入(读取字符串)

 

4
2
分享到:
评论

相关推荐

    mysql-connector-java-5.1.40.tar.gz

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的MySQL驱动程序。"mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为...

    bash-3.1-MSYS-1.0.11-snapshot.tar

    bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 ffmpeg 安装用包!

    libaio-devel-0.3.106(i386 x86_64)

    ```bash rpm -ivh libaio-devel-0.3.106-3.2.i386.rpm ``` 而对于 x86_64 系统,则是: ```bash rpm -ivh libaio-devel-0.3.106-3.2.x86_64.rpm ``` 安装完成后,libaio-devel 提供的头文件(如 `libaio.h`)和开发...

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...

    fontconfig-2.13.0-4.3.el7.x86_64.zip

    在Linux系统中,字体管理是实现正确显示各种字符集,包括中文字符,的关键部分。`fontconfig`是一个开源的字体配置库,它负责管理和查找系统中的字体,为应用程序提供统一的接口来处理字体问题。在没有互联网连接...

    mysql-connector-java-8.0.13.jar

    MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...

    Java-JDK-11.0.8(Windows &amp;amp; Mac os) 下载

    5. **文本块(Text Blocks)**:预览特性,允许在代码中方便地插入多行字符串,减少转义字符的使用。 在下载和安装Java JDK 11.0.8之后,开发者可以使用`javac`编译Java源代码,生成字节码(`.class`文件)。通过`...

    jdk-11.0.16.1-linux-x64-bin.tar

    4. **动态类型字面量**:允许在字符串模板中使用`#{}`,使得表达式计算更为直观。 5. **文本块(Text Blocks)**:改进了多行字符串的表示,减少了转义字符的使用。 6. **改进的JShell(Java REPL)**:增强了交互式...

    bash-4.1.2-15.el6_5.1.x86_64.rpm

    修复redhat6 bash远程执行任意代码漏洞CVE-2014-6271

    perl-5.26.1.tar.gz

    - 支持Unicode 9.0,增强了字符串和正则表达式的处理能力。 - `List::Util`模块新增了一些实用函数,如`minmax`,方便处理列表数据。 - 错误消息和诊断信息的改进,提高了调试的便利性。 Perl语法特点: - 采用C...

    rlwrap-0.37.tar.gz

    总的来说,rlwrap提供了一种更高效、更易用的方式来与sqlplus交互,尤其是在处理字符编码问题时。对于需要频繁使用sqlplus的数据库管理员和开发者来说,rlwrap是一个非常实用的工具。通过正确配置和使用rlwrap,可以...

    protoc.exe和protobuf-java-2.5.0.jar集合

    综上所述,`protoc.exe`和`protobuf-java-2.5.0.jar`是protobuf工具链的关键组成部分,它们一起帮助开发者在Java环境中定义、编译和处理protobuf数据结构。为了充分利用protobuf,开发者需要了解如何编写.proto文件...

    tftp-server-0.42-3.1.i386.rpm.

    《TFTP服务器在RHEL5系统中的应用与配置详解》 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种轻量级的文件传输协议,常用于设备初始化、固件更新、网络诊断等场景。在RHEL5(Red Hat Enterprise...

    arm-linux-gcc-4.4.3.tar.gz

    为了让系统知道新的交叉编译器的位置,需要在用户或系统的`~/.bashrc`或`/etc/bash.bashrc`文件中添加以下内容: ```bash export CC=/usr/local/arm-linux-gcc-4.4.3/bin/arm-linux-gcc export CXX=/usr/local/arm-...

    apache-tomcat-7.0.70.tar.gz

    尽管Tomcat不是完整的Java EE应用服务器,但它与Java EE的其他组件(如EJB)可以通过与其他服务器(如JBoss或Glassfish)集成来支持。 **Linux系统**: Linux是一种自由和开放源代码的操作系统,广泛应用于服务器...

    fonts-chinese-3.02-12.el5.noarch.rpm和fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm

    同时,对于需要处理中欧语言的环境,ISO 8859-2字体的提供则至关重要,因为它包含了那些区域的特殊字符,使得文本可以正确地被识别和打印。 总的来说,这两个rpm包提供了必要的字体资源,增强了CentOS系统对中文和...

    最新版linux jdk-11.0.8_linux-x64_bin.tar.gz

    4. **文本块(Text Blocks)**:新语法特性,用于处理多行字符串,减少转义字符的使用,提高代码可读性。 5. **改进的垃圾收集器**:包括ZGC(Z Garbage Collector)和Shenandoah,提供了更低的暂停时间,适合大...

    jdk-11.0.18-linux-aarch64-bin.tar.gz

    5. **文本块(Text Blocks)**:Java 11引入了文本块(多行字符串字面量)的预览特性,允许程序员方便地处理多行文本,减少字符串连接操作和转义字符的使用。 6. **其他语言特性和API增强**:包括对TLS协议的更新、...

    qt-embedded-linux-opensource-src-4.5.3.tar.gz 移植

    #### 环境准备与工具介绍 在进行 Qt 移植之前,需要准备以下工具和环境: 1. **ARM-Linux-GCC**:这是一个交叉编译器,用于编译目标平台为 ARM 架构的代码。文中提到的版本为 4.0.1。 2. **Qt X11**:这是用于桌面...

    最新版linux jdk-11.0.16.1_linux-x64_bin.tar.gz

    5. **改进的字符串处理**:如`isBlank()`, `strip()`, `stripIndent()`, 和 `stripTrailing()`方法。 6. **反应式流**:支持非阻塞I/O,适应现代并发编程。 此外,JDK 11还包含对HTTP客户端的内置支持,以及对TLS...

Global site tag (gtag.js) - Google Analytics