Shell 编程详解之变量

一、变量

1、变量的定义

定义的格式:

variableName="value"
如:num=100

注意:变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
2、变量名的命名规范

a. 只能使用数字、字符、下划线。

b. 首个字符必须为字母(a-z,A-Z)。

c. 不能使用bash里的关键字(可用help命令查看保留关键字)。

如:myNum、getValue等。

3、变量的使用

使用一个定义过的变量,只要在变量名前面加美元符号($)即可。但是有时候为了区分边界,需要给变量名加上花括号{ }。

#!/bin/sh
A=5
AB=6
echo "A=$A, AB=$AB, ${A}B"
运行结果如下所示:

A=5, AB=6, 5B

推荐给所有变量加上花括号,这是个好的编程习惯。

for skill in Ada Coffe Action Java 
do
    echo "I am good at ${skill}Script"
done

4、变量的重新定义

已定义的变量,可以被重新定义。如下所示:

#!/bin/sh
A=1
echo "A=$A"
A=2
echo "A=$A"
运行结果如下所示:

A=1
A=2
5、只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被修改。如下所示:

#!/bin/sh
readonly A=1
echo "A=$A"
A=2
echo "A=$A"
运行结果如下所示:

zqj@Zqj-ubuntu:~/Shell$ ./readonly.sh 
A=1
./readonly.sh: line 4: A: readonly variable
A=1
6、变量的删除

删除变量的格式:

unset variableName
在删除变量之后,就不能够再使用该变量,并且unset不能删除只读变量!如下所示:

#!/bin/sh
A=1
echo "A=$A"
unset A
echo "A=$A"
运行结果如下所示:

A=1
A=    //第二次没有打印出A的值,说明变量A已经被删除了。
7、变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。


二、特殊变量

1、变量名以及它的含义

$0 :当前脚本的文件名。

$n :传递给脚本或函数的参数。n 是一个数字,表示第几个参数。

$# :传递给脚本或函数的参数个数。

$* :传递给脚本或函数的所有参数。
$@ :传递给脚本或函数的所有参数。
$? :上个命令的退出状态,或函数的返回值。大部分命令执行成功会返回 0,失败返回 1。
$$ :当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$! :上一个后台命令对应的进程号。

$- :由当前Shell设置的执行标志名组成的字符串。

2、命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

#!/bin/bash

echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
运行结果如下所示:

zqj@Zqj-ubuntu:~/Shell$./test.sh Zhangsan Lisi
File Name : ./test.sh
First Parameter : Zhangsan
Second Parameter : Lisi
Quoted Values: Zhangsan Lisi
Quoted Values: Zhangsan Lisi
Total Number of Parameters : 2
3、$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

效果如下所示:

print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d


三、Shell替换

1、转义字符

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

#!/bin/bash

a=10
echo -e "Value of a is $a \n"
运行结果如下所示:

Value of a is 10

现在加上-e表示对转移字符进行替换。如果不加上-e选项,那么将会原样输出。

Value of a is 10\n
转移字符含义表

转移字符 含义
\\ 反斜杠
\a 警报、响铃
\b 退格(删除键)
\f 换页,移到下页开头
\n 换行
\r 回车
\t 水平制表符(Tab键)
\v 垂直制表符

2、命令替换

命令替换的格式为:

`command`
注意是反引号,不是单引号,这个键位于 Esc 键下方。
#!/bin/bash 

DATE=`date`
echo "Date is $DATE"
运行结果如下所示:

Date is 2017年 03月 26日 星期日 17:04:26 CST

3、变量替换
变量替换可以根据变量的状态来改变它的值。

形式 变量替换说明
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

测试代码如下:

#!/bin/bash

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"

unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"

var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"

echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
运行结果如下所示:

Variable is not set
1 - Value of var is 
Variable is not set
2 - Value of var is Variable is not set

3 - Value of var is 
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix


你可能感兴趣的:(Shell)