一、初识bash

Bash是一种解释型语言,但它也提供了交互式接口,支持变量,因此提供了编程环境,所以可以称bash为程序语言。

解释型语言属于弱类型语言,其特点为:

1.它不强制区分变量类型,即无论存储什么数据,默认均以字符格式(ASCII码)存储。

2.不需要事先声明变量,需要时直接使用,直接赋值;

在弱类型语言中,定义变量通常为:

[set] VAR_NAME=Value    //set可以省略

引用变量为:

${VAR_NAME}            //大多数情况下花括号可以省略

       花括号不能省略的情况:有时候变量后面紧接着一个字符,会造成变量名无法识别,此时

   就需要花括号来加以区分,如以下例子:

   # Animal=Pig

   # echo there is a $Animal.

   # echo there some $Animals.

   # echo there some {$Animal}s.

   2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号


撤销变量:释放之前占用的内存空间已供其他进程或程序使用

unset VAR_NAME        //注意只用变量名,不加$

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_02


二、bash的主要特性

1.使用变量

2.支持快捷键,且快捷键可以自定义

3.支持命令别名(见“10_Linux基础知识及命令————创建和删除文本文件”)

   使用别名的格式为:

# alias 别名=正常命令

   撤销别名的格式为:

# unalias 别名

   比如windows中我们使用cls来清屏,而在Linux中使用clear命令。如果想保留windows的使用习惯,就可

以使用别名:

   # alias cls=clear

   # unaias cls

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_03

   如果不想使用别名而使用原来的命令,则可以使用\命令

           注意:别名只对当前shell有效,即使是同一个用户重新启动的shell,也不能使用别名;如果要使

       别名永久有效,需要定义在配置文件。


   4.
支持命令行的展开:{}(见“8_Linux基础知识及命令————目录的创建与删除”),~ (表示命令的家目录)

5.支持管道

6.支持输入、输出和重定向

7.支持编程

8.支持命令行自动补全和路径补全    

a)命令补全:

采用的方式是在输入命令的部分字符后,按下tab键,bash会自动搜索在PATH环境变量下所有可以执行文件,以补全此命令。但需要注意的是,输入的部分字符必须能够唯一标识某命令;如果无法唯一标识,则再敲一次tab键,将会显示所有以“命令的部分字符”开头的命令。

b)路径补全:

路径补全不是找的环境变量PATH,敲tab键后将会根据命令,搜索输入的部分路径,以寻找唯一标识,如果输入的部分路径不能唯一标识,则再敲一次tab键,显示所有以“部分路径”开头的路径。注意如果输入的路径是相对路径,则从当前路径开始搜索。

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_04

使用命令补全和路径补全,可以避免出错误




三、bash中的快捷键

Ctrl+A:快速跳至命令行首

Ctrl+E:快速跳至命令行尾

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


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

Ctrl+L:用于清屏幕,等同于clear命令

Ctrl+C:取消或终止当前命令

Ctrl+Z:将当前命令送至后台执行


四、bash 的变量类型

1.本地变量:只对当前shell的进程有效,换一个shell(即使是同一个用户开启的子shell)就失效了。

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_05

2.局部变量:它的范围比本地变量更小。即只限于部分代码块,不包括当前shell的所有位置。其定义方式为

local VAR_NAME=Value

3.环境变量:它的作用范围比本地变量大,它对当前shell及其子shell都有效(在shell中又打开了一个shell)其声明方式为

export VAR_NAME=Value

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_06


4.位置变量:常见的有——$1, $2,...

5.特殊变量:常见的有——$$, $!, $#, $?


尽管bash 是一种弱类型语言,但bash的变量是可以声明的,甚至可以指定类型,使用的命令是:declare,例如:

# Declare -i VAR_NAME        //声明一个整型变量,被声明的变量可以进行运算了

# Declare -x VAR_NAME        //声明一个环境变量

# Declare -a VAR_NAME//声明一个数组


五、变量的命令法则

1.变量的命名只能使用字母、数字和下划线

2.由于Linux区分大小写,因此不同的大小写字母可以作为不同的变量名,但通常情况下不建议这样做。变量名建议做到“见名知意”,即名字能够表示变量的基本含义。

3.抱持风格统一,例如全部使用大写或者小写,而不是一会儿大写,一会儿小写。

4.建议首字母大写,采用“驼峰式”,即两个单词的首字母大写,如UserName

5.环境变量建议采用大写。注意我们自己起变量名时不要和原有的环境变量名重名,否则会覆盖原有变量。比如USER这样的变量名不要使用。


六、如何在bash中查看环境变量

1.查看环境变量

可以使用以下命令:

# printenv

或者

# export   //注意不带任何参数


2. 查看所有变量(包括环境变量和本地变量)

可以使用以下命令:

# set

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_07


七、在bash中如何引用变量

引用变量最常用的方式是:$(VAR_NAME)

但如果要实现变量替换,则需要在双引号中实现,这是由bash中引号的作用决定的:bash中引号的主要有三种:

双引用:弱引用,可以实现变量的替换

单引号:强引用,不替换变量,而是现实字符串本身

反引号:位于键盘上Esc键下方(``),作用是实现命令引用, `` 等同于$()。它可以用于将某一命令的执行结果赋值给一个变量。

例如要显示当前时间:

# echo The time is `date +%T`

或者是:

# echo The time is $(date +%T)

再如要创建一个文件,要以当前日期为文件名,可以执行如下命令:

# touch file-$(date -%F).txt

或者是

# touch file-`date -%F`.txt

2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换_Linux bash 变量 引号_08


. 变量替换

Bash语言是一种弱类型语言,所有数据都是以字符的方式存放,引用变量进行替换的标准形式为:${VAR_NAME},这里的花括号{}通常可以被省略。实际上,变量替换还有一些其他的形式,可以应用于不同的场景:

A.${parameter:-word}Use  Default Values.  If parameter is unset ornull, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

使用默认值。这里的parameter是指的变量名,如果没有定义变量或变量的值为空,则变量名后面用使用冒号加一个值,该值会作为变量的默认值使用;如果变量已经被赋值了,则冒号后的默认值不会替换原有的值。

[root@localhosttutor]# Name=Jerry

[root@localhosttutor]# echo ${Name:-Tom}

Jerry
#尽管设定了默认值,如果变量已经赋值,则不使用默认值而使用赋的值

[root@localhosttutor]# unset Name

#撤销变量


[root@localhosttutor]# echo ${Name:-Tom}

Tom
#没有为变量Name赋值,就引用其默认值


[root@localhosttutor]# echo $Name

#直接引用变量,则为空


 

B. ${parameter:=word}Assign Default Values.  If parameter is unset or null, the expansionof word is assigned to parameter.  Thevalue of parameter is then substituted. Positional parameters and special parameters may not be assigned to inthis way.

     赋予默认值。和前一种情况非常类似,不同的是,这里冒号后面的值不仅作为默认值,并且会保存在变量中。


[root@localhosttutor]# echo ${Name:=Max}

Max
#变量Name使用默认值Max


[root@localhosttutor]# echo $Name

Max
#变量Name被赋予了初值

 

 C. ${parameter:?word}

            Display Error if Null or Unset.  If parameter is null or unset, the expansionof word (or a message to that effect if                         word is not present) is written tothe standard error and the shell, if it is not interactive, exits.  Otherwise, the value of             parameteris substituted.

如果变量值为空,或没有声明变量,则问号?后面的值会定向至标准错误输出。

[root@localhosttutor]# unset Name

[root@localhosttutor]# echo ${Name:? No Value}

-bash:Name:  No Value
#?后面的值错误信息输出

 

 D. ${parameter:+word}

            Use Alternate Value.  If parameter is null or unset, nothing issubstituted, otherwise the expansion of word is substituted.

如果变量没有声明或值为空,则不作任何操作;如果变量已经赋值了,则用加号+后面的值替换原来赋的值。


[root@localhosttutor]# echo $Name

 
#变量Name没有值


[root@localhosttutor]# echo ${Name:+Mickey}

 
#不作任何操作

[root@localhosttutor]# Name=Neal

[root@localhosttutor]# echo $Name

Neal
#变量被赋值Neal

[root@localhosttutor]# echo ${Name:+Mickey}

Mickey
#用加号+后的值来替换变量原有的值

[root@localhosttutor]# echo $Name

Neal
#加号并不是为变量重新赋值,只是在某些特定的场合才进行替换

 

上述四种用法都不会为变量赋予初始值。现在考虑一种情况,某个脚本需要和用户进行交互,如果用户输入了值,则将该值赋给变量,否则就使用默认值。可以使用下面这种方式来赋初始值:

read-p “A String” -t String

String=${String:-word}

#这里的减号可以替换成加号+或者等号=