天天看点

Shell编程入门进阶之Bash Shell特性

Bash特性之一:命令行展开

~ :展开为对应用户的家目录。比如 cd ~UserName

{,,,,,}  : 他能在命令行展开的时候展开为多个路径。

创建 x/y   x/z   x/z/1   x/z/2

则用:mkdir -pv x/{y,z/{1,2}}

Bash特性之二:shell引用

Shell中的引用.

'  ':强引用,变量替换不会进行

" ":弱引用,能够执行变量替换

` `:命令替换,引用命令的执行结果;命令替换的另外一符号:$(命令);

变量替换:${变量名},只要能够替换就能操作

Bash特性之三:命令历史

命令历史

      bash保存的过去曾经执行过的命令的列表;

      当前shell进程的保存在缓冲区中;

      缓冲区中的命令会在shell退出时保存至文件中, .bash_history

      使用上下箭头键可以翻看此前曾经执行过的命令;  

   #history 快捷方式

   #!#-> #为命令历史列表中的命令编号;可执行第#条命令;

   #!!->执行上一条命令

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

   #!$->引用上个历史命令的最后一个参数;ESC->.

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

   #history–c –>清空命令历史

   #history–d #->清除指定的历史命令条目

   #history–a ->追加当前会话的命令历史到历史文件中

   #historyn ->数字,要列出最近的n条命令列表

   #history–w ->将目前的history记忆内容写入HISTFILES

   #history-r ->将HISTFILES的内容读到目前这个shell的history中

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

       HISTSIZE:命令历史中可以保存的命令的个数;

       HISTFILE: 命令历史文件;

       HISTFILESIZE:命令历史文件可以保存的命令的个数;

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

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

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

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

       使用方法:

           export HISTCONTROL=参数

           撤销HISTCONTROL的控制:#unset HISTCONTROL

Bash特性之四:别名机制

       #alias    不带任何选项显示当前系统定义的别名条目

       #\ls      不使用别名机制,命令本身

如何定义别名:

       #alias 别名='原始命令'(如果原始命令没有空格可不加引号)

               例如:#alias cdnet='cd /etc/sysconfig/network-scripts'

       #unalias 别名  ->撤销自定义的别名

如需要使其永久生效可写入局部配置文件中:~/.bashrc(每个用户可自定义)

Bash特性之五:Globbing,文件名通配

   * :匹配任意长度的任意字符    

   ?:  匹配任意单个字符

   [ ]:匹配指定字符范围内的任意单个字符

   [a-z]  --->不区分大小写  --->[[:lower:]] 所有小写字母

   [A-Z] --->不区分大小写  --->[[:upper:]] 所有大写字母

   [0-9]                                    [[:digit:]] 所有数字

   [a-z0-9A-Z]                          [[:alnum:]] 所有字母和数字    

                                               [[:alpha:]] 所有大小写字符

                                               [[:space:]] 空白字符

                                               [[:punct:]] 特殊符号、标点符号

[^]:匹配指定字符范围外的任意单个字符;

如:非数字:[^0-9]  

Bash特性之六:Bash 在命令行快捷键

   Ctrl+a: 跳至命令行首

   Ctrl+e: 跳至命令行尾

   Ctrl+u: 删除命令行首至当前光标所在处的内容

   Ctrl+k: 删除当前光标所有处至命令行尾的内容

   Ctrl+l: 清屏,相当于clear命令

   Ctrl+c: 取消或终止;

   Ctrl+z: 将当前命令送至后台

Bash特性之七:Bash补全

       命令补全:    

           shell命令:内容,外部

                   外部:在系统某路径下有一个可执行程

           PATH,是一组由:分割的路径

           使用Tab键执行补全

       路径补全:在给出的打头的路径补全;如果没有打头的路径,则为当前;

Bash特性之八:提供编程环境

程序=指令+数据

       变量:

           弱类型语言:

               1、不强制区分变量的类型,无论存储何种数据,均以字符格式进行;

               2、无须事先声明;用到时,直接使用,直接赋值;

           bash: 动态编程语言,是弱类型语言;

Bash特性之九:Bash中的变量

变量的类型:

   1.本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效;

       定义变量:[set]Var_Name="Value"

       引用变量:${Var_Name}

       撤销变量:unset Var_Name    

       不带任何参数的"set"命令  将会显示当前系统中的变量

   2.局部变量:仅对局部代码生效

               local Var_Name="Value"

   3.环境变量:对当前shell进程及其子shell有效;

               export Var_Name="Value"

               Var_Name="Value"

               export Var_Name

               导出

   4.位置变量:在脚本中直接应用

               $1......

   5.特殊变量:

           $0:    (脚本名自身)

           $#     (传递到脚本的参数列表)

           $*      (以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个)

           $$     (脚本运行的当前进程ID号)

           $!      (后台运行的最后一个进程的ID号)

           $@    (使用时加引号,并在引号中返回每个参数)

           $-      (显示shell使用的当前选项,与set命令功能相同)

           $?     (显示命令的最后退出状态,0表示没有错误,其它任何值都表明有错误)

变量的命名要求:

   变量在赋值时不能使用$;

   变量名只能包含字母、数字和下划线,而且不能以数字开头;

   变量名区别大小写;

环境变量:用来bash的工作特性,用于保存当前会话的属性信息;

#env,export,printenv

显示当前系统所有环境变量

Bash特性之十:输入输出重定向

I/O:设备的寄存器

文件描述符:file descript,FD

INPUT:标准输入(standardinput->stdin),文件描述符0

OUTPUT:标准输出(standardoutput-stdout),文件描述符1

显示器容纳两个数据流:

标准错误输出的错误流:stderr,文件描述符2

I/O重定向:

1.<->输入重定向符号

<< EOF

->此处创建文件Here Docunment(常用于在脚本中创建文件或生成菜单)

2.>->覆盖输出重定向符号

>>->追加输出重定向符号

例如:ls /var>/tmp/var.out

ls/etc >> /tmp/var.out ->追加

#set-C ->禁止使用覆盖重定向至已存在的文件

#set+C ->关闭上述特性

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

/dev/null:bitbucket,位桶,数据黑洞

例如只想知道ls命令是否成功,而不需要显示结果

则:ls /etc> /dev/null | echo $?

2>->错误覆盖重定向

2>>->错误追加重定向

例如:lss /etc2> /tmp/etc.err

同时重定向标准输出和错误输出:

COMMNAD> /path/to/outfile 2> /path/to/errfile

无论成功与否,结果都保存在同一个文件中

COMAMAD&> /path/to/somefile

继续阅读