一、变量
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、$* 和 $@ 的区别
效果如下所示:
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 | 垂直制表符 |
命令替换的格式为:
`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