一、什么是bash?
- bash是一个命令处理器, 运行在文本窗口中, 并能执行用户直接输入的命令.
- bash还能从文件中读取Linux命令, 称之为脚本.
- bash支持通配符, 管道, 命令替换, 条件判断等逻辑控制语句
- bash是shell的一种,bash是Linux系统默认使用的shell。shell就是一个命令行解释器,用户想要以不同的方式与Linux内核交互,就可以采用不同的shell,例如除bash外还有zsh、csh等等。
二、bash 编程基础
变量
- 变量名区分大小写,a和A为两个不同的变量。
- 变量名可以使用大小写字母混编的形式进行编写。
- 变量名与值之间的=两侧都不能有空格。
- 在读取或打印变量时,需使用$+变量名。
- 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换为变量值。
- 在 Bash 中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型
命名规则
- 命名只能使用英文字母,数字和下划线,首个字母不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可以用help命令查看保留关键字)
- 系统定义的变量
- 通常是以大写字母形式存在
- 如 BASH、SHELL等
- 用户定义的变量
- 多数以小写字母参与命名
- 但不具有大小写强制性规定
变量操作
定义一个只读变量a
a="123
readonly a
删除变量
unset a
变量类型
- 字符串
name="julia"
# 获取字符串长度
string="abcd"
echo ${#string} # 输出 4
#变量为数组时,${#string} 等价于 ${#string[0]}:取数组第一个元素的长度
- 拼接的字符串
name="Julia"
str="Hello, "$name"!"
- 数组
各个值之间用空格分隔
array_name=(1 2 3 4 "hahah")
# 取单个值
value2=${array_name[2]}
echo $value2
# 单独赋值
array_name[2]=8
value3=${array_name[2]}
echo $value3
# 取所有的值
echo ${array_name[*]}
echo ${array_name[@]}
引号
- 输入的内容为简单的字符串或文本时,单引号和双引号的作用没有任何区别
- 输出一个已定义的变量,则需要使用双引号
数组
- 数组可以定义为相似类型元素的集合,在bash中数组不必是相似类型元素的集合
- 索引数组的声明和赋值 (类似Python里的数组)
declare -a Array_Name # 索引数组
Array_Name[index_1]=value_1
Array_Name[index_2]=value_2
或
Array_Name=(
[index_1]=value_1
[index_2]=value_2
)
- 关联数组的声明和赋值(类似Python里的字典)
declare -A Array_Name # 关联数组
Array_Name[name1]=value_1
Array_Name[name2]=value_2
或
Array_Name=(
[name1]=value_1
[name2]=value_2
)
- 数组的访问
declare -a arr1=( hello world )
declare -A arr2=( [key1]=hello [key2]=world )
echo ${arr1[0]}
echo ${arr2[key1]}
- 取出所有元素
declare -a arr=( hello world )
echo ${arr[@]}
echo ${arr[*]}
# 在数组前加一个感叹号 ! 可以获取数组的所有键
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
echo "数组的键为: ${!site[*]}"
echo "数组的键为: ${!site[@]}"
- 获取数组长度
declare -a arr=( hello world )
echo "arr length is ${#arr[@]}"
# 需要看总长度的时候使用@ 如果是当个元素长度则使用索引/key
控制语句
IF
# 单条件
if [ expression ];then statements; fi
# 多条件与
if [ expression_1 ] && [ expression_2 ];then statements; fi
# 多条件或
if [ expression_1 ] || [ expression_2 ];then statements; fi
# 多分支
if [ expression_1 ] ; then statements
elif [ expression_2 ] ; then statements
else statements
fi
- if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt。
- 如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <。
FOR
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 写成一行
for var in item1 item2 ... itemN; do command1; command2… done;
- in列表是可选的,如果不用它,for循环使用命令行的位置参数。
WHILE
while condition
do
command
done
UNTIL
until condition
do
command
done
- until 循环执行一系列命令直至条件为 true 时停止。
- until 循环与 while 循环在处理方式上刚好相反。
- 一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
case ... esac
- case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
- case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
- 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
函数
- 函数的定义格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
- 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
# 实例
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum # 从终端或者文件中读取输入,读取整行输入,换行符不被读入
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" #函数返回值在调用该函数后通过 $? 来获得。
- 脚本参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
- $0 脚本名称
- $1~$n 获取参数
- $# 传递到脚本的参数个数
- $$ 脚本运行的当前进程ID号
- $* 以一个单字符串显示向所有脚本传递的参数
- $? 显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误