变量
#!/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 命令不能删除只读变量。
特殊变量
- $0 当前脚本的文件名(包含路径)
- $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
- $# 传递给脚本或函数的参数个数。
- $* 传递给脚本或函数的所有参数。(所有一起)
- $@ 传递给脚本或函数的所有参数。(一个一个)被双引号(" ")包含时,与 $* 稍有不同。
- $? 上个命令的退出状态(退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1),或函数的返回值。
- $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,
- "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;
- "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
变量替换(为空变量的处理)
变量替换就是为空变量的处理,变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值
形式 |
说明 |
${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}" #没有打印,脚本在上一行时就停止了运行
数组
#!/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