bash 特性详解需整理

Bash介绍:

Bash(GNU Bourne-Again
SHell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等
等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell
Script通常可以在很多种Shell上使用

BASH的正确缩写:

BASH = GNU Bourne-Again SHell,BASH 是 GNU 组织开发和推广的一个项目。

BASH的作者和产生:

Bourne shell 的作者是 Steven Bourne,它是 UNIX 最初使用的 Shell 并且在每种 UNIX 上都可以使用。

而BASH 与 Bourne shell 完全向后兼容,是Bourne shell的扩展。

bash 内置特性

文件名通配:globbing

Bash本身没有正则表达式的功能,在脚本里,使用正则表达式的是命令和软件包

例如sed和awk,它们可以解释正则表达式.

Bash
所做的是展开文件名扩展 -- 这就是所谓的通配(globbing) -- 但它不是使用标准的正则表达式. 而是使用通配符.
通配解释标准的通配符:*和?, 方括号括起来的字符,还有其他的一些特殊的字符(比如说^用来表示取反匹配).然而通配机制的通配符有很大的局限性.
包含有*号的字符串将不会匹配以点开头的文件,例如.bashrc. 另外,通配机制的? 字符和正则表达式中表示的意思不一样.

看图说话:


1

2

3

4

5

6

7

8

9

10

11

12

13

14


#在script创建了五个文件

[[email protected] script]# touch a.1 b.c c.c t2.sh test.txt

[[email protected] script]# ls

a.1  b.c  c.c  fdisk.sh  local.sh  t2.sh  test.txt  tss.sh

[[email protected] script]# ls -l

total 12

-rw-r--r--. 1 root root    0 Feb 22 08:18 a.1

-rw-r--r--. 1 root root    0 Feb 22 08:18 b.c

-rw-r--r--. 1 root root    0 Feb 22 08:18 c.c

-rw-r--r--. 1 root root 3126 Feb 22 00:44 fdisk.sh

-rw-r--r--. 1 root root   28 Feb 22 07:25 local.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 t2.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 test.txt

-rw-r--r--. 1 root root   10 Feb 22 01:39 tss.sh


1

2

3


#查看一下script以t开头的中间跟任一字符,以.sh结尾的文件

[[email protected] script]# ls -l t?.sh

-rw-r--r--. 1 root root 0 Feb 22 08:18 t2.sh


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


#查看以[ab]任意一个字母开头的文件

[[email protected] script]# ls -l

total 12

-rw-r--r--. 1 root root    0 Feb 22 08:18 a.1

-rw-r--r--. 1 root root    0 Feb 22 08:30 abc.ddl

-rw-r--r--. 1 root root    0 Feb 22 08:31 anb.ppt

-rw-r--r--. 1 root root    0 Feb 22 08:18 b.c

-rw-r--r--. 1 root root    0 Feb 22 08:18 c.c

-rw-r--r--. 1 root root    0 Feb 22 08:30 cvb.doc

-rw-r--r--. 1 root root 3126 Feb 22 00:44 fdisk.sh

-rw-r--r--. 1 root root   28 Feb 22 07:25 local.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 t2.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 test.txt

-rw-r--r--. 1 root root   10 Feb 22 01:39 tss.sh

[[email protected] script]# ls -l [ab]*

-rw-r--r--. 1 root root 0 Feb 22 08:18 a.1

-rw-r--r--. 1 root root 0 Feb 22 08:30 abc.ddl

-rw-r--r--. 1 root root 0 Feb 22 08:31 anb.ppt

-rw-r--r--. 1 root root 0 Feb 22 08:18 b.c


1

2

3

4

5

6

7

8

9


#非字母a或b开头的文件

[[email protected] script]# ls -l [^ab]*

-rw-r--r--. 1 root root    0 Feb 22 08:18 c.c

-rw-r--r--. 1 root root    0 Feb 22 08:30 cvb.doc

-rw-r--r--. 1 root root 3126 Feb 22 00:44 fdisk.sh

-rw-r--r--. 1 root root   28 Feb 22 07:25 local.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 t2.sh

-rw-r--r--. 1 root root    0 Feb 22 08:18 test.txt

-rw-r--r--. 1 root root   10 Feb 22 01:39 tss.sh


1

2

3

4

5


[[email protected] script]# ls -l {b*,c*,*st*}

-rw-r--r--. 1 root root 0 Feb 22 08:18 b.c

-rw-r--r--. 1 root root 0 Feb 22 08:18 c.c

-rw-r--r--. 1 root root 0 Feb 22 08:30 cvb.doc

-rw-r--r--. 1 root root 0 Feb 22 08:18 test.txt

注:Bash会对命令行中没有引号引起来的字符尝试文件名扩展


1

2


[[email protected] script]# echo *

a.1 abc.ddl anb.ppt b.c c.c cvb.doc fdisk.sh local.sh t2.sh test.txt tss.sh

文件名扩展能匹配点开头的文件,但仅在模式字串明确地包含字面意思的点(.)时才扩展.


1

2

3

4

5

6


[[email protected] ~]# ls -a .bash_*

.bash_history  .bash_logout  .bash_profile

[[email protected] ~]# ls -al [?]bash_*

ls: cannot access [?]bash_*: No such file or directory

[[email protected] ~]# ls -al [.]bash_*

ls: cannot access [.]bash_*: No such file or directory

这样还是可以的


1

2

3

4


[[email protected] ~]# ls -al .[b]?sh_profile

-rw-r--r--. 1 root root 176 May 20  2009 .bash_profile

[[email protected] ~]# ls -al .[b]?shr*

-rw-r--r--. 1 root root 176 Sep 22  2004 .bashrc

可以改变Bash对通配字符进行解释的行为.

set -f 命令或set -o noglob可以禁止通配机制, 并且shopt的选项nocaseglob和nullglob 能改变通配的行为.


1

2

3

4

5


[[email protected] script]# ls a*

a.1  abc.ddl  anb.ppt

[[email protected] script]# set -f

[[email protected] script]# ls a*

ls: cannot access a*: No such file or directory

这时表明通配功能己经关闭,如果要开启,可以使用

set +o noglob

命令补全、路径补全

Bash中的命令分为两种,一种是bash自带的内部命令,一种是通过环境变量读取的可执行文件,这个变量就是PATH,以冒号间隔的多个路径,命令补全则是通过PATH的多路径查找到可执行的文件所在位置


了简化打字工作,bash shell
提供了几种可以对输入不完整的文本进行自动补全的方法,如果想对输入进行补全,只需输入初始的几个字符,然后按“Tab”键,系统会自动匹配所需要的其余
输入,当有多种匹配时,系统会结出提示,按"ESC+?"组合键或按两次"Tab"键,可以列出所有可能的匹配,自动补全可以应用于下面的4类输入工作之
中。

环境变量名补全

如果输入的文本以"$"开始,shell就以当前shell的环境变量补全文本

用户名补全

如果输入的文本以“~”开始,shell会以用户名补全文本。

命令、别名或函数的名字补全

如果文本以常规字符开始,shell将利用命令、别名或函数名来补全文本

主机名补全

如果输入的文本以“@”符号开始,系统会利用/etc/hosts文件中的主机名来补全文本

自动补全快捷键(此快捷键在远程终端无法使用)

Alt+~  以一个用户名补全此处文本

Alt+$ 用变量补全此处的文本

[email protected]以一个主机名补全此处文本

路径补全

而路径补全是在给出打头路补全,如果没有打头的路径,则视为以当前路径开始补全。

命令历史

Bash可以保存过去曾经执行过的命令列表(即history 命令产生的列表),当前shell进程引用过的命令都会保存在缓冲区中,如果有退出操作时,缓冲区中的命令会在shell退出时将以前运行过的命令保存至文件中(即用户家目录下的.bash_histor)

history 快捷方式:

!#:为命令历史列表中的命令编号,可用执行第#条命令

!!:执行上一命令;

!- #:执行命令历史列表中的倒数第#命令;

!string :执行命令历史列表中的最近一次以string开头的命令;


1

2

3

4

5


[[email protected] etc]# echo "$PATH"

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/axel/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/apache/bin:/usr/local/apache/bin:/usr/local/axel/bin:/usr/local/nginx/sbin

[[email protected] etc]# !e

echo "$PATH"

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/axel/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/apache/bin:/usr/local/apache/bin:/usr/local/axel/bin:/usr/local/nginx/sbin

!$:引用上一个命令的最后一个参数;(也可以使用按下esc,之后按一下.)

history

-c: 清空列表


1

2

3

4

5

6

7

8

9


[[email protected] etc]# history  |tail -5

  119  history -d 199

  120  history -d 119

  121  history  |tail -5

  122  history -d 118

  123  history  |tail -5

[[email protected] etc]# history -c

[[email protected] etc]# history

    history

-d #: 删除指定的历史命令


1

2

3

4

5

6

7

8

9

10

11

12

13


[[email protected] etc]# history  |tail -5

  118  history

  119  history  |tail -5

  120  history -d 199

  121  history -d 119

  122  history  |tail -5

[[email protected] etc]# history -d 118

[[email protected] etc]# history  |tail -5

  119  history -d 199

  120  history -d 119

  121  history  |tail -5

  122  history -d 118

  123  history  |tail -5

-a: 追加当前会话的命令历史至历史文件中去;

命令历史相关的环境变量:

HISTSIZE:命令历史中可以保存的命令的个数;( echo $HISTSIZE,默认1000条)

HISTFILE: 命令历史文件;(echo $HISTFILE,用户的历史文件存放的位置)

HISTFILESIZE:命令历史文件可以保存的命令的个数;(echo "$HISTFILESIZE"默认1000条)

HISTCONTROL: 控制命令历史的生成;

ignoredups: 忽略记录重复的命令;连续的相同命令才为重复;


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16


[[email protected] ~]# echo "$HISTCONTROL"

ignoredups

[[email protected] ~]# echo "$HISTCONTROL"

ignoredups

[[email protected] ~]# echo "$HISTCONTROL"

ignoredups

[[email protected] ~]# echo "$HISTCONTROL"

ignoredups

[[email protected] ~]# echo "$HISTCONTROL"

ignoredups

[[email protected] ~]# history |tail -5

   15  echo "$HISTCONTRAL"

   16  echo "$HISTCONTROL"

   17  history

   18  echo "$HISTCONTROL"

   19  history |tail -5

ignorespace: 不记录以空白字符开头的命令;


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16


[[email protected] ~]#  history |tail -5

   31  history

   32   echo "$HISTCONTROL"

   33  HISTCONTROL=ignorespace

   34  ls /var

   35  history

[[email protected] ~]#  ls /

bin   etc   lib64       misc  opt   sbin     sys  var

boot  home  lost+found  mnt   proc  selinux  tmp

dev   lib   media       net   root  srv      usr

[[email protected] ~]#   history |tail -5

   31  history

   32   echo "$HISTCONTROL"

   33  HISTCONTROL=ignorespace

   34  ls /var

   35  history

ignoreboth: 同时具有上面两种特性;

命令行编辑(快捷键)

ctrl+a:光标移动到行首

ctrl+e:光标移动到行尾

ctrl+u:清除光标前至行首的所有内容

ctrl+k:清除光标后至行尾的内容

ctrl+l:清屏

Ctrl+f光标向后移动一个字符

ctrl+b:光标向前移动一个字符

ctrl+h:删除光标前的一个字符

ctrl+d:从当前shell登出(和exit很像) "EOF"(文件结束符)

ctrl+i:就是一个tab键

ctrl+j:新行

ctrl+m:回车

esc b:左移一个单词

esc f:右移一个单词

输入、输出重定向、管道


linux系统中,数据流可分为3类:数据输入,数据输出和错误输出,相对的,每一个进程也都有3个特殊的文件描述:标准输入(stdin,文件描述指针
为0),标准输出(stdout,文件描述指针为1)和标准错误输出(stderr,文件描述指针为2),这3个特殊文件描述指针使进程在通常情况下接收
标准输入设备的输入,由标准输出设备显示输出.

而在输入通常指传给一个命令的键盘输入。通常标准输出是被定向到显示器,如果在执行过程中发
生错误,可能会发生错误,可能会存在一条错误消息,这是标准错误数据流,通常也会被定向到显示器。有两种基本的方法可以用来重定向标准输入
(stdin)、标准输出和标准错误(stderr),可以利用管道把这些数据流之一输送组另一个命令,也可以利用I/O重定向把这些数据流之一重定向一
个文件.所谓管道是指将某一个命令的输出结果传送到另一个命令,当成另一外命令的输入,其代表符号是"|".所谓I/O重定向是指命令执行的结果重新导出
到其他设备或文件(以">"或“>>”来表示)或是重新导入到其他设备或文件(以"<"或"<<"来表示)

分类:

输入重定向:<, <<

<: 输入重定向

<< EOF: 此处创建文件, Here Document

常用于在脚本中创建文件或生成菜单;


1

2

3

4

5

6

7

8

9

10

11

12


[[email protected] script]# cat  echo.sh

cat <<EOF

   cpu) print cpu  information

   mem) print memory information

   disk) print disk information

   quit) quit

EOF

[[email protected] script]# bash echo.sh

   cpu) print cpu  information

   mem) print memory information

   disk) print disk information

   quit) quit

输出重定向:>, >>

>: 覆盖输出

>>: 追加输出

set -C:禁止使用覆盖重定向至已经存在的文件;

set +C: 关闭上述特性;

>|:在-C特性下,强制使用覆盖重定向;

错误重定向:2>, 2>>

2>: 覆盖

将错误的信息输出到指定的文本中(会覆盖原文本的内容)

2>>: 追加

将错误输出到文本的的最后一行(不会覆盖原文本的内容)

管道

在linux系统中,管道的主要功能是将其他程序的输出结果直接导出到另一个程序作为输入数据,即将前一个程序的输出作为后一个程序的输入

并不是所有的命令都可以用管道接收


1

2

3


#pwd

/var/log

#ls /var/log | file

此命令将无法执行。(由于file在此时引用的是相对路径,如果想正确使用必须要使用如下方法)


1

#file `ls /var/log`|cut -d: -f2 |tr -d ‘ ‘|sort|uniq

(查看var/log下的文件类型,并取出第二段,除去前端的空格,排序,并去掉重复的.)

tee:

将第一个命令的结果保存到文件并同时输出到显示器。


1

#ls /etc |tee /tmp/etc.out |tr ‘a-z‘ ‘A-Z‘|tr -d ‘0-9‘

此命令就是将/etc下的所有目录或文件,全输出到/tmp/etc.out并在显示器显示时,去掉‘0-9‘的数字(/tmp/etc.out中的数据并不会因此而发生变化。)

命令别名

alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。

alias
命令的基本格式为alias [word[=‘command‘]],
[]内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出
当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。

如果bash
的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会
导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:


1

2


#设置别名扩展(启用别名)

#shopt -s expand_aliases

时间: 2024-08-26 13:19:50

bash 特性详解需整理的相关文章

[鸟哥linux视频教程整理]03_02_Linux文件管理类命令及bash特性详解

一.文本排序 sort  默认不是按照数值大小进行排序,是按ACIIS表进行排序. -n:按数值大小进行排序: -r:降序排序 -t:字段分隔符 -k:以哪个字段为关键字进行排序 [[email protected] ~]# sort -t: -k3 -n /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin -u:排序后相同的行只显示一次 -f:排序时忽略字符大小写 uniq: 不相邻的相同行不

linux基础篇-06,linux bash特性详解

################################################ bash及其特性 shell外壳 clt:sh csh ksh bash tcsh zsh 程序和进程之间的关系:1个程序,多个进程 进程:每个进程,当前主机只存在内核和当前进程 进程是程序的副本,进程是程序的执行实例 用户工作环境 bash shell与子shell ################################################ bash支持以下特性 1,命令历史

linux初级学习笔记五:bash特性详解!(视频序号:03_2,3)

本节学习的命令:history,alias,ualias,\CMD 本节学习的技能:   bash的特性 光标跳转 查看命令历史 命令历史的使用技巧 给命令起别名 命令替换 文件名通配符 shell: 外壳 GUI:Gnome, KDE, Xfce CLI: sh, csh, ksh, bash, tcsh, zsh 进程:在每个进程看来,当前主机上只存在内核和当前进程 进程是程序的副本,进程是程序执行实例 用户工作环境: bash: #:管理员命令提示符 $:普通用户命令提示符 bash的特性

03_03 bash特性详解(下)

命令别名 alias COMALIAS='COMMAND [options] [arguments]' 在shell中定义的别名仅在当前shell生命周期中有效:别名的有效范围仅为当前shell进程: ualias COMALIAS 删除别名 alias cp = 'cp -i' 命令替换 $(COMMAND) 反引号 `COMMAND` 把命令中某个子命令替换为其执行结果的过程 echo "the current directory is /etc" echo "the c

iOS开发——高级特性&amp;Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

http协议及httpd特性详解

前言 随着互联网的迅猛发展和网络的普及,各类网站层出不穷,网站也成为企业宣传和实力展现的主要途径之一,说到网站就不得不说一下web服务了,现在比较流行的web服务还是当属Apache即httpd.本文将详解http协议及httpd的特性. http协议详解 http协议 http: Hyper Text Transfer Protocol 超文本传输协议 传输文本:HTML html: Hyper Text Mark Language 超文本标记语言 html文档的生成方式 静态:纯html格式

C#中的 特性 详解(转载)

本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,即可在运行时使用"反射"的技术查询特性. 特性具有以下属性: 特性可向程序中添加元数据.元数据是有关在程序中定义的类型的信息.所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员.可

c#特性详解【含常用过滤器实例】

基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 本来7月份想着是用一个月把基础拾遗写完的,结果断断续续写了4个月了,才写了这几篇,这两天又规划着多写几篇,希望能坚持吧.两天一次和同事聊天竟然好多人都不知道,他们每天却都在用. 1.特性概念 特性(Attribute)是用于在运行时传递程序中各种元素(