bash shell 文本流及重定向

bash

bash及其特性:

​ 1、bash实质上是一个可执行的程序,一个用户的工作环境。

​ 2、每一个shell下可以再打开一个shell,新打开的shell称为子shell,每一个shell之间相互独立。

​ 3、可以使用pstree命令查看当前shell下的子shell个数

使用:
1、光标跳转:

Crtl + a : 跳到命令行行首

Crtl + e : 跳到命令行行尾

Crtl + d : 删除光标所在字符

Crtl + u : 删除光标到命令行行首的字符

Crtl + k :删除光标到命令行行尾的字符

Crtl + l : 清屏

Crtl + “左/右箭头” : 跳过整个单词

2、命令历史

bash会自动记录过去执行的命令,并缓存进内存。

查看历史命令: history

清空历史:-c

删除从第n个命令开始的m个字符,m默认为1:-d + n m

保存命令历史到历史文件:-w

显示并执行第n条命令: !n

执行历史命令中倒数第n条命令:! -n

执行上一条命令: !!

执行命令历史中的最近一个以指定字符串开头的命令:!+"",例如之前有一条命令:source /etc/profile ,想再次执行时只需: ! source 即可。

引用上一个命令的最后一个参数: !$

当用户正常退出时,内存中的命令历史会被保存到用户目录中的bash history文件中,这是一个隐藏文件,bash history保存的历史命令数量是有限的,最大为1000条,HISTSIZ 这是一个环境变量,表示命令历史缓存区大小。

3、命令别名

alias设置命令别名,例如 alias cls= ‘clear’

alias NAME = COMMAND [option] 相当于变量赋值。只能在当前shell声明周期内有效,要想永久生效,需修改root下的.bashrc 文件,vi /root/.bashrc 然后把 alias cls= ‘clear’ 添加进去,再执行命令 souce /root/.bashrc(是修改立即生效) 即可。

alias : 查看所有已经定义的命令别名

ualias : 取消已经定义的命令别名

如果加一个命令别名与一个命令的名称相同,则使用时shell下运行的是该别名表示的命令,如果想要使用原命令,则使用\COMMAND表示命令本身。

4、命令替换

将命令中的某个子命令替换为它的执行结果

表示形式:command $(子命令) ,command 子命令 此处是单反引号而不是单引号

bash支持的引号: 反引号,用于命令替换。" " 双引号,弱引用,可以实现变量替换。’ ’ 单引号,强引用,不能实现变量替换。

5、文件通配

​ 用于表示任意长度的任意字符串,任意长度包括0
? 用于表示任意单个字符
    [] 匹配任意指定范围内的任意单个字符串
   [:space:]表示空白符号
   [:punct:]表示标点符号
   [:lower:]表示小写字母
   [:upper:]表示大写字母
   [:alpha:]表示所有大小写字母
   [:digit:]表示数字
   [:alnum:]表示数字和字母
   [^] 表示匹配任意指定范围外的单个字符

时间

​ #!/bin/bash
​ time=$(date “+%Y年%h%d日%H时%M分%S秒”)
​ echo “hello world !开始执行 ${time}”

​ #!/bin/bash。

​ #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

shell bash

解释器,启动器

bash(解释器):
​ 用户交互输入
​ 文本文件输入

​ 脚本本质:
​ #! /bin/bash
​ #! /usr/bin/python
​ 读取方式:
​ 当前shell:source/.
​ 新建子shell:/bin/bash file / ./file.sh 《chmod +x file.sh

Shell

​ Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

​ Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

​ Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

Shell中的字符串

单引号的限制:

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  2. 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号的优点:

  1. 双引号里可以有变量
  2. 双引号里可以出现转义字符

文本流及重定向

文本流是文件用于数据的存储,相当于一个个存储数据的房子。所谓的数据是0或者1的序列,严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十进制范围为0到255)。使用ASCII编码,可以将这样一个字节转换成为字符。所以,在Linux中,我们所说的数据,完全可以用字符表达出来,也就是说文本(text)的形式。

重定向是指我们可以人为的干预标准输入输出的位置。简而言之,输入重定向是指把文件导入命令中,而输出重定向则是把原本要输出到屏幕的数据信息写入到指定文件中。

标准输入:文件描述符0,通常指键盘的输入 。使用符号<或<<
  标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
  标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>

默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价。

标准输出重定向:
命令作用
命令 1> 文件将标准输出重定向到一个文件中(清空源文件的数据)
命令 > 文件同 1> 将标准输出重定向到一个文件中(清空源文件的数据)
命令 2> 文件将错误输出重定向到一个文件中(清空源文件的数据)
命令 1>> 文件将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件同 1>> 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1将标准输出、错误输出一同重定向到文件
命令 &>> 文件同上
命令 1> 文件1 2> 文件2将标准输出冲重定向到一个文件,错误输出重定向到另外一个文件

#ls

表示列出当前目录条目,并将结果输出到屏幕。

#ls 1>file1

以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。

即这个命令等同于

#ls >file1

如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。

标准错误重定向:

#ls -qw 2>errorfile

表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。

把标准错误和标准输出写入同一个文件:

#./a.out &>outfile

这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:

#./a.out > outfile 2>&1

下面是一个错误的例子:

#./a.out > outfile 2>outfile

标准输入重定向:
命令作用
命令 < 文件将文件作为命令的标准输入
命令 << 分界符从标准输入读入,遇到分界符停止【注意对换行符敏感】
命令 <<< 内容从字符串读数据
命令 < 文件一 1>文件二将文件一作为命令的标准输入,并将标准输出重定向到文件二

#grep search-world <filename 或 grep search-world 0<filename

还有下面这种方式:

cat > catfile < ~/.bashrc

它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile

关闭文件:

"&-"表示关闭文件标识符

有关关闭文件标识符的操作请参考下面

n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout

屏蔽标准输出或标准错误:

./a.out > /dev/null #等同于./a.out 1>dev/null 表示屏蔽标准输出

./a.out 2>/dev/null #表示屏蔽标准错误

./a.out > /dev/null 2>/dev/null #表示同时屏蔽标准输出和标准错误

打开文件:

#exec 3<>filename           把文件filename打开,并指定文件标识符为3

命令j<>filename表示把文件打开,并指明文件标识符为j

我们什么时候需要重定向:

1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。

  1. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。
  2. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。
  3. 一些执行命令的可能已知错误信息时,想以“2>dev/null"将它丢掉
  4. 错误信息与正确信息需要分别输出时**
常用重定向命令:

cmd > file 把 stdout 重定向到 file 文件中;

cmd >> file 把 stdout 重定向到 file 文件中(追加);

cmd 1> fiel 把 stdout 重定向到 file 文件中;

cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

cmd 2> file 把 stderr 重定向到 file 文件中;

cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);

cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

cat <>file 以读写的方式打开 file;

cmd <file cmd 命令以 file 文件作为 stdin;

cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。

&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;

<&n 标准输入复制自文件描述符 n;

<&- 关闭标准输入(键盘);

&- 关闭标准输出;

n<&- 表示将 n 号输入关闭;

n>&- 表示将 n 号输出关闭;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值