1基础知识
**1、第一个shell命令:**
**2、如何运行shell程序**
3种方式
1、赋予程序文件可执行权限
2、调用命令解释器
3、使用source命令
3、shell命令种类
1、内部命令
Shell解释器本身包含的命令,在文件系统中没有相应的可执行文件,不能用“sudo”。
如:cd, echo, source等。
在执行内部命令时,不需要创建新进程。
source命令也称为“点命令”,可以用点符号(“.”)代替。
2、Shell函数
以Shell语言书写的一系列程序代码,可以像其他命令一样被 引用。
3、外部命令
独立于Shell的可执行程序,在文件系统中有相应的可执行文件。
如:ls, find, locate, grep, ifconfig等。
命令行会创建一个当前Shell的复制进程来执行它,执行过程存在进程的创建和消毁。
子进程改变的环境变量只影响本进程,而不会影响父进程 ($PWD) 。
4、shell执行命令的顺序
顺序
别名
关键字
函数
内部命令
外部命令
在同名时,别名的优先级最高而外部命令的优先级最低。
内部命令 “type”。
5、注释、退出状态和逻辑操作
1、注释
以“#”开头的文本表示注释,Shell解释器将忽略“#”之后的所有内容。
如果要将“#”作为普通字符对待,需在其之前加“\”进行转义,或使用引
号对其进行引用。
2、退出状态
每一条Shell命令在退出时都会返回一个整数值给命令行Shell。
“退出状态”用于指示命令的运行情况:成功还是失败,如果失败了是什么原因导致的失败。
一般约定以0表示成功,非零值表示失败。
使用特殊变量“$?”可以查看上一条命令的退出状态值。
3、逻辑操作
一般情况下,脚本程序中的各条命令是从上到下顺序执行的,不论上
一条命令执行是否成功(退出状态为0),下一条命令都能得到执行。
各条命令可以分行书写;也可以在一行中书写,但各命令之间要以“;”分
隔开来,执行时按从左到右的顺序依次执行。
除了使用“;”连接命令之外,还可以使用逻辑与(“&&”)运算符和逻
辑或运算符(“||”)连接两条命令。 “!” 亦可用
“&&”和“||”均具有短路特性。
6、复合命令
用“{}”或“()”将多条命令括起来,使其在语法上成为一条命令。
复合命令中的各个命令之间必须用分号或换行符分隔开来。如果使用“{}”
的话,还应注意:“{”后应有至少一个空格,“}”前应有一个分号或换行符。
用“{}”括起的命令在本Shell内执行,用“()”括起的命令在一个子Shell内执
行。
7、变量的赋值与引用
变量用于存储数据。
由字母、数字或下划线组成,并且只能以字母或下划线开头,大小写的意义是不同的。
弱类型的语言,变量存储的一切值都是字符串。但是必要的时候,只要是由数值构成的字符串,也可对其执行数值操作。
变量赋值的方式: 变量名=变量值
“=”两边不能有任何空格;当变量值中包含空格时,应为其加上引号。
引用变量: $变量名
Shell变量不需要预先定义,而且可以引用未赋过值的变量。
在字符串中可以引用变量,使其值成为本字符串的一部分。
在变量名后面紧跟一个由非空白字符开始的字符串时,应该用花括号“{}”将变量名括起来.
清除变量的值:unset
得到变量的长度: ${#变量名}
8、命令替换
将一个或多个命令的执行结果赋值给变量
两种方式
反引号
$(…)
9、变量属性声明
使用内部命令declare或typeset 限定变量的属性。
常用选项
-r 只读
-i 整数
-a 数组
-f 函数
-x 导出变量
10、数组变量
bash支持一维数组变量。
无须事先声明,数组的元素个数没有限制。
形式类似 C语言:
赋值 数组名[下标]=值
引用 ${数组名[下标]}
数组元素的下标由0开始编号。
组合赋值:数组名=(值1 值2 ... 值n),各个值之间应以空格分开
引用没有带下标的数组名相当于引用下标为0的数组元素。
引用数组中的所有非空元素。
${array_name[*]}
${array_name[@]}
获取数组中的所有非空元素的个数
${#array_name[*]}
${#array_name[@]}
取消数组定义
11、变量引用操作符
在引用变量时进行额外的判断或替换操作。
1、字符串替换
${varname:-word}
如果varname存在且非空串,则返回varname的值,否则返回word。
作用: 如果变量未定义,则取默认值。
${varname:=word}
如果varname存在且非空串,则返回varname的值,否则将varname的值设为word,并返回word。
作用: 如果变量未定义,则取默认值。
${varname:+word}
如果varname存在且非空串,则返回word的值,否则返回空串。
作用: 测试变量是否存在。
${varname:?message}
如果varname存在且非空串,则返回varname的值,否则输出message,并退出当前脚本程序。
作用: 捕捉变量未定义导致的错误。
四种字符串替换格式中,每个冒号都是可选的。如果省略冒号,则判断“varname是否存在”,而不论是否非空。
2、模式匹配替换
模式是指含有通配符的字符串 (*, ?, [])。
${varname#pattern}
如果pattern匹配varname的头部,则删除最短匹配部分,并返回剩余部分,varname本身不变。
${varname##pattern}
如果pattern匹配varname的头部,则删除最长匹配部分,并返回剩余部分,varname本身不变。
${varname%pattern}
如果pattern匹配varname的尾部,则删除最短匹配部分,并返回剩余部分,varname本身不变。
${varname%%pattern}
如果pattern匹配varname的尾部,则删除最长匹配部分,并返回剩余部分,varname本身不变。
${variable/pattern/string}
${variable//pattern/string}
将varname的最长匹配部分替换为string,并返回替换后的串,varname本身 不变。
第一种格式仅替换第一次匹配的子串,第二种格式会替换
12、位置参数和特殊变量
1、位置参数
也称位置变量。
运行Shell脚本程序时,命令行Shell传递给脚本的参数,以及在Shell脚本程序中调用函数时传递给函数的参数。
位置变量的名称是以0,1,2,...这些整数命名的,相应地以$0, $1, $2, …等进行引用。
0对应命令名(脚本名),1对应第一个实参,2对应第二个实参,... 。
2、特殊变量
“$*” 和 “$@”的区别
只在加了双引号后$*和$@才有区别。
”$@”表示的是引用所有参数, 相当于 “$1” “$2”... “$N”,即 N个以空格分隔的字符串。
“$*”表示引用所有参数连接在一起(中间以空格分隔)的字符串。
如果用于数组,”${数组名[@]}”表示引用数组整体的各个元素,”${数组名 [*]}”表示引用所有数组元素连接在一起(中间以空格分隔)的字符串。
3、用法
4、设置位置参数
‘
使用内部命令 “set”
5、移动位置参数
使用内部命令 “shift”.原来的$2的值赋给$1(原$1的值永远丢失),原来的$3的值赋给$2,…。会使参数个数少一,即$#的值会减一。