Shell 是什么?
- Shell 指一种应用程序,它提供了一个界面 用户通过这个界面访问操作系统内核的服务
- Shell 脚本(shell script) 用shell 编写的脚本程序。 shell 通常都是指 shell 脚本
- Linux的精髓:将多个程序(命令)组装成大型程序, 而Shell 就是最好粘合剂
- Shell的优点 简单、高效、易维护、随写随用
- Shell 开发流程:需求分析、问题建模、为代码流程逻辑、代码实现与运行、总结
- 脚本所有种类查看:cat /etc/shells
- 正在使用的种类:echo $SHELL
- 编码规范:多加注释说明、命名建议规则:变量名大写、局部变量小写、函数名小写、函数变量 加 local
- 编辑器 VS Code:宿主机中写的代码,同步到虚拟机中,需要设置共享文件夹,配置sftp:查看 -> 命令面板 -> SFTP config
使用:
- bash头部默认用bash:#!/bin/bash
- 注释:#单行注释用于行首解释说明,多行注释用::<<EOF ...EOF
Shell 基础语法:
- 变量:命名只能使用英文字母,数字和下划线、首个字符不能以数字开头、中间不能有空格,可以使用下划线(_)、不能使用bash里的关键字(help命令查看)
- 变量分类:局部变量、环境变量、特殊变量
- 局部变量:仅在当前shell实例中有效、在脚本或命令中定义、函数内的变量 加 local
- 变量的定义和使用:
#!/bin/bash
# 1. 变量的定义 和使用
my_name=zhangchulan
echo "1. $my_name"
# 2. 另一种定义方式
course="linux start"
echo 2. ${course}
# 3. 只读变量, 不加$
readonly course
course="linux kernel"
echo "3. ${course}"
# 4. 删除变量, 不加$
unset my_name
echo "4. ${my_name}"
结果:
1. zhangchulan
2. linux start
2-variable.sh: line 13: course: readonly variabl
基本运算:
#!/bin/bash
# 关系运算
a=11
b=5
#例子, 其他 ne, gt, ge, lt, le 类似
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
结果:
11 -eq 5: a 不等于 b
- 布尔与逻辑运算:! 非运算 [ ! false ]、-o 或运算、-a 与运算 [ $a -lt 100 -a $b -gt 15 ] 、&& 逻辑与 [[ $a -lt 100 && $b -gt 100 ]] 、|| 逻辑或 、== 相等(数字)、 != 不等(数字)
#!/bin/bash
# 布尔运算
a=11; b=5
#例子, 其他 ne, gt, ge, lt, le 类似
if [ $a -eq $b ]
then
echo "$a equal $b : a 等于 b"
else
echo "$a not equal $b: a 不等于 b"
fi
# 逻辑运算 注意 两个 [[ ]]
if [[ $a -gt 0 && $b -gt 0 ]]
then
echo "a, b 都大于 0"
fi
结果:
11 not equal 5: a 不等于 b
a, b 都大于 0
- 字符串:单引号:原样输出,变量无效;双引号:可以包含变量
#!/bin/bash
course="Linux入门"
# 单引号
question="Linux 如何入门?$course"
echo $question
# 双引号
answer="请学习$course:课程!"
echo $answer
# 字符串拼接
echo "拼接后一起输出:\n"$question"\n"$answer
结果:
Linux 如何入门?Linux入门
请学习Linux入门:课程!
拼接后一起输出:
Linux 如何入门?Linux入门
请学习Linux入门:课程!
1 #!/bin/bash
2 # 字符串长度
3 str="hello wolrd"
4 echo "字符串"$str"的长度为:"${#str}
5
6 # 获取子串, 从第1个字符开始,截取3个。
7 echo "字符串"$str"子串:"${str:1:3}
8
9 # 查找子串
10 matched=`expr index "$str" wo`
11 echo "字符串" $str "查找wo的位置在" $matched
结果:
字符串hello wolrd的长度为:11
字符串hello wolrd子串:ell
5
字符串 hello wolrd 查找wo的位置5
- 字符串运算符:
1 #!/bin/bash
2 # 算术基本运算, 加减乘除取余
3 a=11
4 b=5
5
6 # 加法 expr
7 val=`expr $a + $b`
8 echo "$a + $b = $val"
9
10 # 另一种数值运算 $[var]
11 val=$[a-b]
12 echo "$a - $b = $val"
结果:
11 + 5 = 16
11 - 5 = 6
- 数组:定义, 下标从 0 开始、设置/读取、读取数组所有元素 @、读取数组长度
1 #!/bin/bash
2 # 1. 数组的定义
3 arr=(aa bb cc "hello world")
4 # 2. 设置 元素
5 arr[2]="222"
6 # 3. 读取 元素
7 echo "下标为2的元素:"${arr[2]}
8 # 4. 读取 所有元素, 用 @
9 echo "所有元素:"${arr[@]}
10 # 5. 获取数组长度, 用 #
11 len=${#arr[@]}
12 echo "数组长度:$len"
结果:
下标为2的元素:222
所有元素:aa bb 222 hello world
数组长度:4
1 #!/bin/bash
2
3 age=20
4 if [ $age -le 10 ] # <=10
5 then
6 echo "少年"
7 elif [ $age -le 20 ] # <=20
8 then
9 echo "青年"
10 elif [ $age -le 50 ] # <=50
11 then
12 echo "中年"
13 else # >50
14 echo "老年"
15 fi
结果:
青年
1 #!/bin/bash
2
3 status=1
4 case $status in
5 0) echo "todo"
6 ;;
7 1) echo "doing"
8 ;;
9 2) echo "done"
10 ;;
11 esac
结果:
doing
1 #!/bin/bash
2 # for 循环输出 数组内容
3 arr=(aa bb cc)
4 for item in ${arr[@]}
5 do
6 echo "$item"
7 done
结果:
aa
bb
cc
更多参考:https://wangdoc.com/bash/intro.htm