Shell变量
定义变量
定义变量时,变量名不加美元符号,如:
name="xiaodouzi"
注意,变量名和等号之间不能有空格。
除了显式直接赋值,还可以用语句给变量赋值,如将/etc 下目录的文件名循环出来
for file in 'ls /etc'
或
for file in $(ls /ect)
使用变量
使用一个定义过的变量,只要在变量名前加美元符好即可,如:
name="xiaodouzi"
echo $name
echo ${name}
变量名外面的花括号是可选的,,加花括号是为了帮助解释器识别变量的边界,如下面这种情况:
for skill in ada coffe action java;do
echo "I am good at ${skill}script"
done
如果不给skill变量加花括号,写成 echo "I am good at $skillscript",解释器就会把$skillscript 当成一个变量,代码执行结果就不是预期的样子了
已定义的变量,可以被重新定义,如:
name=xiaodouzi"
echo ${name}
name="pangpang"
echo ${name}
这样写是合法的,但注意,第二次赋值的时候不能写成)
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被该变,如下:
readonly name="xiaodouzi"
echo ${name}
name="吃饭睡觉打豆豆"
echo ${name}
运行脚本,结果如下:
xiaodouzi
script.sh: line 8: name: readonly variable
删除变量
使用unset删除变量。语法
unset variable_name 变量被删除后不能再次使用,unset命令不能删除只读变量,如下:
#!/bin/bash
readonly id=000001
name="xiaooduzi"
sex=0
echo ${id},${name},${sex}
unset sex # 删除变量
echo ${sex}
unset i
运行脚本,结果如下:
000001,xiaooduzi,0
script.sh: line 8: unset: id: cannot unset: readonly variable
变量的类型
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
- 环境变量 所有程序,包括shell启动程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分时环境变量,有一部分时局部变量,这些变量保证shell的正常运行
shell 字符串
字符串是shell变成中最常用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号
单引号
str='this is string'
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
#! /bin/bash
name='runoob'
str="hello, I know you are \"${name}\"!\n"
echo -e $str
输出结果为:
hello, I know you are "runoob"!
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符串
name="xiaodouzi"
string="hello,\"${name}\"!"
string1='hello,'${name}'!'
echo $string,$string1
执行结果:
hello,"xiaodouzi"!,hello,xiaodouzi!
获取字符串长度
name="xiaodouzi"
echo ${#name}
输出 9
提取子字符串
一下实例从字符串第3个字符开始截取取4个字符:
name="xiaodouzi"
echo ${name:2:4}
输出 aodo
第一个字符的索引值为0
查找子字符串
查找字符i或o的位置
name="xiaodouzi"
echo `expr index ${name} io`
输出 2
shell 数组
bash 支持以为数组(不支持多为数组),并且没有限定数组的大小
定义数组
在shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 值n)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制
读取数组
读取数组元素的一般格式是:
{array_name[@]}
获取数组的长度
#获取数组元素的个数
length=${#array_name[@]}
length=${#array_name[*]}
#获取数组单个元素的长度
length=${#array_name[n]}
shell 注释
单行注释
以#开头的就是行注释,会被解释器忽略
多行注释
多行注释还可以使用一下格式:
:<<EOF
注释内容
EOF
EOF也可以使用其他符号:
:<<!
注释内容
!