《学习bash》笔记--输入输出

1.I/O重定向符

I/O重定向符如下:

  • cmd1 | cmd2:管道,接收cmd1的标准输出作为cmd2的标准输入。
  • >file:将标准输出定向到file
  • <file:从file接收标准输入
  • >>file:将标准输出定向到file,如果file存在则附加在后面
  • >|file:即使设置了noclobber仍然强制标准输出到file。

shell提供了一种称为noclobber的特性,该特性可防止重定向时不经意地重写了已存在的文件。通过设置变量noclobber可以

将此特 性打开。打开后若将输出重定向到某个已存在文件,则shell将报告错误消息,并且不执行重定向命令。

例如:

[email protected]:~# cat a.txt

123

[email protected]:~# set -o | grep "noclobber"

noclobber       off

[email protected]:~# echo "test1" > a.txt

[email protected]:~# cat a.txt

test1

[email protected]:~# set -o noclobber

[email protected]:~# set -o | grep "noclobber"

noclobber       on

[email protected]:~# echo "hello" > a.txt

-bash: a.txt: 无法覆盖已存在的文件

[email protected]:~# echo "hello" >| a.txt

[email protected]:~# cat a.txt

hello

  • n>|file:即使设置了noclobber仍强制从文件描述符n中输出到file。

例如:

[email protected]:~# cat a.txt

123

[email protected]:~# set -o | grep "noclobber"

noclobber       off

[email protected]:~# ls nosuchfile 2> a.txt

[email protected]:~# cat a.txt

ls: 无法访问nosuchfile: 没有那个文件或目录

[email protected]:~# echo "123" > a.txt

[email protected]:~# cat a.txt

123

[email protected]:~# set -o noclobber

[email protected]:~# set -o | grep "noclobber"

noclobber       on

[email protected]virtual-machine:~# ls nosuchfile 2> a.txt

-bash: a.txt: 无法覆盖已存在的文件

[email protected]:~# cat a.txt

123

[email protected]:~# ls nosuchfile 2>| a.txt

[email protected]:~# cat a.txt

ls: 无法访问nosuchfile: 没有那个文件或目录

  • <>file:使用file同时作为输入和输出。

主要用于设备文件,也就是对应诸如终端和通信线路的硬件设备,底层系统程序员可以使用它测试设备驱动器,否则,它不是很有用。

  • n<>file,以读写方式打开file,并将n重定向到该文件。

要说明这个重定向符之前,先要说明exec命令:

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令

后的其它命令将不再执行。因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个

shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。不过,要注意一个例外,当exec命令来对文件描述符操

作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。

  1. $ exec 3<>file
  2. $ ls >&3
  3. $ cat file
  4. file
  5. $ cat <&3
  6. $ exec 3<>file
  7. $ cat <&3
  8. file

将文件描述符3定向到file,然后把标准输出定向到3以后,标准输出的内容就写入到file中。同样从标准输入读的时候,将标准输入定向

到3,会打印出file的内容。由上面的结果还能看到exec 3<> file只针对一条指令有效。

  • n>file,以写式打开file,并将n重定向到该文件。

例如:

[email protected]:~/test# exec 3> file

[email protected]:~/test# ls >& 3

[email protected]:~/test# cat file

a

b

[email protected]:~/test# cat <& 3

cat: -: 错误的文件描述符

  • n<file,以读式打开file,并将n重定向到该文件。

例如:

[email protected]:~/test# cat file

test

[email protected]:~/test# exec 3< file

[email protected]:~/test# ls >& 3

ls: 写入错误: 错误的文件描述符

[email protected]:~/test# cat <& 3

test

[email protected]:~/test# cat <& 3

[email protected]:~/test#

同样,exec 3< file只针对一条指令有效。

  • <<label:here-document

<<label重定向符强制一个命令的输入使用shell的标准输入,并一直读到仅含label的行。期间的输入称为here-document

例如:

# cat > msgfile << EOF

> 1

> 2

> 3

> EOF

[email protected]:~/test# cat msgfile

1

2

3

重定向<<有两个变体,首先,你可以通过把label括在单引号或双引号内防止shell进行参数和命令替换,例如:

[email protected]:~/test# cat << EOF

> $PWD

> EOF

/root/test

[email protected]:~/test# cat << "EOF"

> $PWD

> EOF

$PWD

第二个变体是<<-,它从here-document和标签行中删除前导TAB(但不删除空格)。

例如脚本内容如下:

#!/bin/bash

cat <<- EOF

123

456

EOF

执行后,输出为:

123

456

  • n>> file:将文件描述符n定向到file,如果file存在则附加到后面,例如:command 2>> file
  • n>& :将标准输出复制到文件描述符n
  • n<& :从文件描述符n复制标准输入
  • n>&m:使文件描述符n成为输出文件描述符m的副本

例如:

[email protected]:~/test# cat file

test

[email protected]:~/test# ls nosuchfile

ls: 无法访问nosuchfile: 没有那个文件或目录

[email protected]:~/test# ls nosuchfile > file 2>&1

[email protected]:~/test# cat file

ls: 无法访问nosuchfile: 没有那个文件或目录

  • n<&m:使文件描述符n成为输入文件描述符m的副本
  • &>file:定向标准输出和错误输出到file。

例如:

[email protected]:~/test# ll a nosuchfile &> file

[email protected]:~/test# cat file

ls: 无法访问nosuchfile: 没有那个文件或目录

-rw-r--r-- 1 root root 0 2014-08-01 09:09 a

  • <&-:关闭标准输入

例如有如下脚本:

exec <&-

cat

执行结果:

# ./a.sh

cat: -: 错误的文件描述符

cat: 关闭标准输入: 错误的文件描述符

  • >&-:关闭标准输出

例如有如下脚本:

exec >&-

echo "test"

执行结果:

# ./a.sh

./a.sh: 第 2 行: echo: 写错误: 错误的文件描述符

  • n>&-:关闭从文件描述符n的输出

例如:

[email protected]:~# ls

a.sh  file  test

[email protected]:~# exec 3<> file

ro[email protected]:~# ls >&3

[email protected]:~# exec 3<> file

[email protected]:~# exec 3>&-

[email protected]:~# ls >&3

-bash: 3: 错误的文件描述符

  • n<&-:关闭从文件描述符n的输入

例如:

[email protected]:~# exec 3<> file

[email protected]:~# cat <&3

a.sh

file

test

[email protected]:~# exec 3<> file

[email protected]:~# exec 3<&-

[email protected]:~# cat <&3

-bash: 3: 错误的文件描述符

2.字符串I/O

2.1.echo

echo将其参数简单地打印到标准输出上。echo接收短划线选项,如下表。

-e:打开斜线转义字符的解释

-E:关闭子系统上反斜线转义字符的解释,此为默认模式。

-n:省略最后的换行

例如:

[email protected]:~# echo -e "a\ta"

a       a

[email protected]:~# echo -E "a\ta"

a\ta

[email protected]:~# echo -n "a\ta"

a\[email protected]:~#

2.2.read

read允许你将值读到shell变量中,基本语法是:

read var1 var2 ...

该语句从标准输入中接收一行,将其分开形成单词,单词间用环境变量IFS的值中的任意字符分隔。单词然后被赋值到变量

var1,var2...

例如,a.sh的内容为:

read v1 v2

echo $v1

echo $v2

执行结果:

# ./a.sh

123 456

123

456

如果单词比变量多,则额外的单词被赋值到最后的变量中,如果你省略了变量,则整个输入被赋值到变量REPLY中。

例如,再次执行上面的脚本:

# ./a.sh

1 2 3 4

1

2 3 4

修改a.sh的内容为:

read

echo $REPLY

执行结果为:

# ./a.sh

1 2 3 4

1 2 3 4

下面介绍如下从文件中读取变量。

例如,file文件内容如下:

arg1-1 arg1-2

arg2-1 arg2-2

arg3-1 arg3-2

方法一:

使用如下a.sh脚本可以进行变量的读取:

while read v1 v2;do

echo $v1 $v2

done

执行结果:

# ./a.sh < file

arg1-1 arg1-2

arg2-1 arg2-2

arg3-1 arg3-2

方法二:

修改a.sh:

while read v1 v2;do

echo $v1 $v2

done < file

执行结果:

# ./a.sh

arg1-1 arg1-2

arg2-1 arg2-2

arg3-1 arg3-2

方法三:

修改a.sh:

func(){

while read v1 v2;do

echo $v1 $v2

done

}

func < file

执行结果:

# ./a.sh

arg1-1 arg1-2

arg2-1 arg2-2

arg3-1 arg3-2

方法四:

修改a.sh:

{

while read v1 v2;do

echo $v1 $v2

done

} < file

执行结果:

# ./a.sh

arg1-1 arg1-2

arg2-1 arg2-2

arg3-1 arg3-2

read有3个常用选项:-a,-p和-r。

-a允许你将值读到一个数组中,每个连续的条目读取都被赋值到以下标0开始的给定数组中,例如a.sh内容如下:

read -a people

echo ${people[0]} ${people[1]} ${people[2]}

执行结果:

# ./a.sh

1 2 3

1 2 3

-p选项在读取输入前打印该字符串,例如:

[[email protected]nPC ~]# read -p "dir?" dirname

dir?/home

[[email protected] ~]# echo $dirname

/home

-r选项在读取输入时不忽略“\”字符。

如果"\"在输入字符串的内部:

[[email protected] ~]# read dirname

123\456

[[email protected] ~]# echo $dirname

123456

[[email protected] ~]# read -r dirname

123\456

[[email protected] ~]# echo $dirname

123\456

如果"\"在输入字符串的最后:

[[email protected] ~]# read dirname

123\

> 456

[[email protected] ~]# echo $dirname

123456

[[email protected] ~]# read -r dirname

123\

[[email protected] ~]# echo $dirname

123\

《学习bash》笔记--输入输出

时间: 2024-11-08 21:08:13

《学习bash》笔记--输入输出的相关文章

《学习bash》笔记--进程处理

1.进程ID和作业编号 当通过附加&号后运行命令时,shell会响应如下: $ ls & [1] 3318 其中[1]是作业号,3318是进程号. 一个后台进程完成时,shell会给出作业编号信息,如下: [1]+  Done                    ls --color=auto 如果作业以非0状态退出时,shell指出其退出状态. 2.作业控制 作业编号可以使它们在shell命令中进行作业控制.一旦作业在后台运行,你可以让它一直运行,或把它放到前台,或向其发送信号. 2.

《学习bash》笔记--调试shell程序

在shell中,最简单的调试助手时输出语句echo,可以通过把许多echo语句放到代码中进行调试,但必须花费足够的时间以定位 要查看的信息.可能必须通过许多的输出才能发现要查找的信息. 1.set选项 最基本的时set -o命令选项,当运行脚本时,这些选项可以用在命令行上,如下表所示: set -o选项      命令行选项      行为 noexec            -n                     不运行命令,值检查语法错误 verbose           -v  

《学习bash》笔记--命令行处理

shell从标准输入或脚本中读取的每行称为一个管道行,它包含一或多个由0个或多个管道符分割的命令,对其读取的每个管道 行,执行下面的操作. 1.将命令分成由固定元字符集分隔的记号:SPACE.TAB.NEWLINE.;.(.).<.>.|和&.记号类型 包括单词.关键字.I/O重定向符和分号. 2.检测每个命令的第一个记号,查看为不带引号或反斜线的关键字.如果是一个开放的关键字,如if和 其他控制结构起始字符串.function.{或(,则命令实际上为一复合命令.shell在内部对复合

《学习bash》笔记--基础shell编程

1.shell脚本和函数 脚本是包含shell命令的文件,它是一个shell程序,有三种方式运行它们: 一是键入source scriptname,使得脚本的命令被读取并运行,就好像键入它们一样. 二是运行bash scriptname,打开一个子shell来读取并执行脚本文件中命令.该脚本文件可以无"执行权限". 三是使用./scriptname,打开一个子shell读取并执行脚本文件中的命令,该脚本需要"执行权限". 1.1.函数 函数是一种脚本内脚本,你使用它

《学习bash》笔记--定制用户环境

1. .bash_profile..bash_logout和.bashrc文件 当用户和退出一个新的shell时,文件.bash_profile..bash_logout和.bashrc文件被bash所读取.在用户每次登陆到系统时, .bash_profile文件被读取,可以对.bash_profile文件进行编辑,但是知道退出并在此登录后,该文件才会被重新读取,你编辑 的新内容才会生效,或者使用source命令: source ./bash_profile bash允许有.bash_profi

《学习bash》笔记--流程控制

bash支持下述流程控制结构: if/else:如果某条件为真/假,执行一个执行列表. for:执行一个语句列表固定次数. while:当某条件为真时重复执行某语句列表 until:重复执行某语句列表直至某条件为真. case:依据一个变量取值执行几个语句列表中的一个. select:允许用户从一个菜单的可选列表中选择一个. 1.if/else 最简单的流程控制结构类型时嵌入在bash的if语句中的条件语句.当选择做或者不做某件事情或者依据条件表达式的真或者假 从数量不多的几个事情里选择一个进行

python学习笔记-输入输出

格式化输出 print(format(value,format_spec)),其中3为打印位数,2f为精度 print(format(12.2356, '3.2f')) print(format(0.23456,'.1%')) D:\Python27\python.exe F:/Self-Study/python-study/input_output.py 12.24 23.5% python学习笔记-输入输出

鸟哥的Linux私房菜_基础版_学习笔记7:第十一章 认识与学习 BASH

11.1 认识 BASH 这个 Shell 图 1.1.1.硬件.核心与用户的相关性图示 11.1.4 Bash shell 的功能 既然 /bin/bash 是 Linux 默认的 shell ,bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell . bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本.不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个 s

[SQLServer]学习总结笔记(基本涵盖Sql的所有操作)

--################################################################################### /* 缩写: DDL(Database Definition Language): 数据库定义语言 DML(Database Manipulation Language): 数据库操作语言 DCL(Database Control Language): 数据库控制语言 DTM(Database Trasaction Manag