变量
#!/bin/bash
name="Job"
echo $name,you is ${name} or lili #-->Job,you is Job or lili 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
name="Lili"
echo $name #-->LIli
readonly age=4 #<==>age=4;readonly age
echo $age #-->4 可以访问
age=22 #-->age: readonly variable
echo $age #-->4
echo $name #-->Lili
unset $name #--无效
echo $name #-->Lili
unset name
echo $name #-->输出为空
unset $age #-->not a valid identifier(不是一个有效的标识符)
unset age #--> age cannot unset: readonly variable
定义变量:定义变量时,变量名不加美元符号($),若使用则提示“变量未找到”
在 Shell Script 中,所有的变量都视为字符串,因此并不需要在定义变量前先定义变量类型。在定义变量时,不必加 $,但是在使用它时,必须加上 $。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 使用变量:使用一个定义过的变量,只要在变量名前面加美元符号($)即可
- 重新定义变量:已定义的变量,可以被重新定义
- 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
- 删除变量:使用 unset 命令可以删除变量。变量被删除后不能再次使用;unset 命令不能删除只读变量。
总结:定义变量、重新定义变量、只读变量(readonly)、删除变量(unset)直接跟变量名,不要在变量名前加$
特殊变量
上面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。
- $0 当前脚本的文件名(包含路径)
- $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
- $# 传递给脚本或函数的参数个数。
- $* 传递给脚本或函数的所有参数。(所有一起)
- $@ 传递给脚本或函数的所有参数。(一个一个)被双引号(" ")包含时,与 $* 稍有不同。
- $? 上个命令的退出状态(退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1),或函数的返回值。
- $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,
- "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;
- "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
系统内定的标准变量:你可以使用 set 这个指令来看目前系统中内定了哪些参数。一般而言会有 $HOME, $SHELL, $USER, $PATH 等。
变量替换(为空变量的处理)
变量替换就是为空变量的处理,变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值
形式 | 说明 |
${var} | 变量本来的值 |
${var:-word} | 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} | 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:+word} | 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
${var:?message} | 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行。 |
#!/bin/bash
echo ${var:-1};echo var1=$var #--> 1 var1=空
echo ${var:=2};echo var2=$var #--> 2 var2=2
echo ${v:+55};echo v=$v #--> 空 va=空
#var已被定义,通过(echo ${var:=2})
echo ${var:+3};echo var3=$var #--> 3 var3=2
unset var
echo ${var:?"Print this message"} #/CentOS/script/test.sh: line 10: var: Print this message
echo "var = ${var}" #没有打印,脚本在上一行时就停止了运行
数组
Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
#!/bin/bash
#定义数组
#在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为: array_name=(value1 ... valuen)
arr_name=("852" v1 v2 v3)
arr_str[45]="me"
arr_str[20]='and'
arr_str[10]="you"
arr_str[1]=123123
#读取数组 一般格式是:${array_name[index]}
echo ${arr_name[2]} #-->v2
echo $arr_name #-->852;数组元素的下标由0开始编号
echo $arr_name[2] #-->852[2] ;字符串连续
echo $arr_str[1] #-->[1];数组元素的下标由0开始编号
#使用@ 或 * 可以获取数组中的所有元素
echo ${arr_name[*]} #-->852 v1 v2 v3
echo "--${arr_str[@]}" #-->--123123 you and me;按先后顺序读取
#获取数组的长度(元素的个数), 与获取字符串长度的方法相同
len=${#arr_name[*]}
echo $len #-->4
len=${#arr_str[@]}
echo $len #-->4
#获取单个数组元素的长度
len=${#arr_name[0]}
echo $len #-->3
len=${#arr_name[1]}
echo $len #-->2
len=${#arr_name[10]}
echo $len #-->0;不存在的元素的长度为0
len=${#arr_str[1]}
echo $len #-->6;数值的话,也按字符串的方式计算其长度
#删除数组
#unset array[1] # 删除数组中第一个元素
#unset array # 删除整个数组
- 定义数组:在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为: array_name=(value1 ... valuen)
- 读取数组: 一般格式是:${array_name[index]} ;使用@ 或 * 可以获取数组中的所有元素
- 获取数组的长度(元素的个数), 与获取字符串长度的方法相同
- 获取单个数组元素的长度
- 删除数组:unset array[1] 删除数组中第一个元素;unset array 删除整个数组
字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号(-->在shell编程中其实只要一种字符串数据类型,数字是一种特殊的字符串)。
#!/bin/bash
#'
str='this is a string\n'
#"
your_name="bai du"
str2="hello,I know your name\"$your_name\"!\n"
#connect
str3="Hello,"$your_name"!"
str4="Hello,${your_name}!"
echo $str #-->this is a string\n
echo $str2 #-->I know your name"bai du"!\n
echo $str3 #-->Hello,bai du!
echo $str4 #-->Hello,bai du!
#get len
echo "your_name.len =" ${#your_name} #-->6;包含空格
#get substr,===>${string:position:length}
echo '${str2:1:6} = '${str2:1:6} #2:1:6} = ello,I ;字符串也是从0开始计数的
单引号:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单引号 双引号:双引号里可以有变量;双引号里可以出现转义字符
命令替换
命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。语法:`command` 注意是反引号,不是单引号,这个键位于 Esc 键下方。
#!/bin/bash
DATE=`date`
echo "Date is $DATE" #Date is 2014年 08月 19日 星期二 14:01:09 CST