一、shell脚本
(1)第一个shell脚本
#!/bin/bash
#this is a comment
echo "hello world"
一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。
“#”开头是注释
(2)脚本运行方式
①直接bash一个文件指明使用bash shell来解释脚本。
bash test.sh
②给脚本加执行权限,‘’./ “执行脚本
chmod +x test.sh
./test.sh
如果希望将一个脚本设置成默认系统命令,只需将该脚本复制到系统$PATH变量所在的目录中,同时赋予可执行权限。下次运行直接输入命令即可。
(3)shell内建命令
① 如何确定内建命令:type
type cd
type ifconfig
② 执行程序:. 和source
. ./test.sh
source test.sh
③创建命令别名:alias
④ 切换目录:cd
⑤ 声明变量:declare/typeset
#!/bin/bash
#shell是弱类型编程语言,声明变量时并不需要指明类型
declare str="hello world"
echo $str
declare a=1
echo $a
declare pi=3.14
echo $pi
fun1()
{
echo "fun1"
}
fun2()
{
echo "fun2"
}
#使用-r 声明变量为只读,不允许修改
#使用-a 声明变量
#使用-F 显示脚本定义的函数
#使用-f 显示脚本定义的函数体
echo "declare -F"
declare -F
echo "declare -f"
declare -f
⑥ 打印字符:echo
该命令默认最后加上换行符,使用 -n 参数可以不打印换行符。
默认情况,禁止解释打印反斜杠转义的字符,若需要打印转义字符,需要使用 -e 参数
⑦ 循环控制:break(跳出循环)/continue (跳过当次循环,进入下一次循环)
⑧ 退出shell:exit
⑨ 整数运算:let
#支持+ - * /(计算结果为整数) % **(次方)
let a=2+2 #a=4
let b=2**3 #b=8
#支持自增/自减
let i++
let j--
#支持+= -= *= /= %=
let c+=10
二、shell编程基础
1、变量
(1)变量名
shell变量必须以字母或下划线开头,后面可以跟数字、字母、下划线,变量长度没有限制。
变量区分大小写。
(2)变量赋值与取值
① 赋值
【定义变量】 变量名=变量值
【注意点1】变量名和变量值之间用等号相连,之间没有任何空格,等号任何一边出现空格就会出错。
【注意点2】当变量中有空格时必须用引号(可以是双引号或单引号)括起来,否则会出错。
② 取值
在变量前加 $ ,或使用${}.
【注意点3】如果变量值引用了其他变量,必须使用双引号。因为单引号会阻止shell解释特殊字符$
(3)取消变量unset
取消变量指将变量从内存中释放,使用命令unset,后面跟变量名。函数也可以被取消,unset后面跟函数名。
(4)数组
数组的每一项称为一个元素,对于每个元素可以使用索引方式取值。数组并不要求数组的每个元素都是相同类型。随时可以根据需要向数组中增加元素。
declare -a arr #定义一个数组
arr[0]=1
arr[1]=2
arr[2]='hello world' #特殊shell中允许如此
#可以在创建时赋值
declare -a name=('jack' 'bob')
#可以给特定的元素赋值
declare -a numbers=([2]=2 [4]=4)#只给2,4索引元素赋值
#数组取值${数组名[索引]}
echo ${name[1]}
#取数组所有元素
echo ${name[*]}
echo ${name[@]}
#从表面上两者没有区别,但${name[*]}得到的是一个字符串,${name[@]}是以空格隔开的元素值
#获取数组元素个数(数组长度)
echo ${
#name[*]}
echo ${
#name[@]}
#字符串数组也可以获取某个元素的长度
echo ${
#name[1]}
#数组截取:可以是截取数组的一部分,也可以是截取数组元素的一部分
echo ${name[@]:0:2}#截取数组name,0表示从索引0开始,数字2表示取两个元素
echo ${name[1]:0:2}#截取元素name[1]
#数组连接:将若干数组拼接
conn=(${name[@]} ${name2[@]})
#元素替换:将数组元素值替换成其他值
conn=(${conn[@]/jack/hellojack})
#取消元素/数组:使用unset将元素释放
unset conn[0]#取消数组索引0元素
unset conn #取消数组conn
(5)只读变量(常量)
这种变量在声明时就要求赋值,并之后无法修改。可以使用readonly内建命令创建,和declare -r 效果声明变量效果一致。
(6)变量的作用域
shell变量的作用域是在本shell内,属于本shell的全局变量,也就是从定义该变量开始到shell结束,或到主动使用unset删除该变量的地方为止。在变量的作用域内,该变量都是可见的,在函数内对变量也是可以访问、修改的。
#!/bin/bash
declare