1.创建shell文件
原则上shell程序可以写在任何文件中,但是一般会在shell文件后加后缀.sh表示当前文件是一个shell文件
shell需要可执行权限,所以创建好的shell文件需要添加x权限
2.基础语法
1.注释
```shell
# 单行注释
:<<EOF
多行注释1
多行注释2
多行注释3
EOF
```
2.输出和输入
输出
echo指令就相当于python中的print函数(默认会换行)
```shell
echo 输出内容
echo -n 输出内容 # 输出的时候不换行
```
echo -n 的用法:
echo -n 'this is a line without new line'
echo 'it is the result'
这样的结果 this is a line without new line it is the result。 不换行
输入指令
read 变量名 -- 输入内容,并且将输入的结果保存在变量中
用法: 1. read name 保存退出 wq
2.这时候在主界面输入 name。
类似于 input()
一般和echo 合起来用 (用于提示)
1.先vim 文件名.sh
2. 进入后,在文件中输入 echo -n 请输入你的名字:
3. read name
3.变量
a. 声明变量的语法: 变量名=值
说明: a. 变量名和=, =和值之间不能有空格
b. 变量名 由数字、下划线、字母组成 ,不能使用数字开头 也不能使用关键字。
```shell
name='小明'
age=18
stu_name=小红
```
b. 使用变量:
echo $变量
echo ${变量}
```shell
age=18
echo $age
age2=${age}
```
举例:
name='xiaoming'
echo $name
echo ${name}
age='18'
echo $name ${age} 可以同时输出两个
num=12345
num1=${num}
echo $num1 这里是将num的值传给num1
c. 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
```shell
gender='男'
readonly gender
gender='女' # test.sh: line 17: gender: readonly variable
```
d. 删除变量
使用 unset 命令可以删除变量
```shell
name='yuting'
unset name
```
4 获取linux指令结果
在shell脚本中可以直接写linux指令,在执行shell脚本的时候这些指令可以直接获取
```shell
ls # ls指令
ls -lh # ls指令,并且设置参数
touch a.txt # 创建a.txt文件
python3 py文件路径
# 获取指令结果: 变量=$(指令) / 变量=`指令`
lsresult=$(ls) #将ls指令的结果保存到变量lsresult中. r1=$(ls)
currnet_path=`pwd`
1.r1=$(ls)
2.变量名=`指令` r2 = `python3 /root/code/phello.py` , echo $r2
实际例子:
r1=$(ls -lh|head -2)
r2=`python3 /root/code/phello.py`
echo -n $r1
echo $r2
注意:指令是用(), 但是echo ${} 是用大括号
5.shell字符串
1.shell中的字符串可以用单引号也可以使用双引号甚至可以不用引号。但是单引号中不能出现单引号字符,加\也不行
```shell
str1='abc'
str2="abc"
str3=abc
str4='abc\n123' #支持转义字符,但是不支持编码字符
str5="abc\n123"
age=18
str6="年龄是$age" #双引号里面可以出现变量,单引号不行
```
2.字符串拼接
```shell
str1="hello"
#单引号拼接
str2=''${str1}',world!'
str3=''$str1',world!'
#双引号拼接
str4="${str1},world!" # (记住!!)
str5=""$str1",world!"
```
拼接实际例子:
想获取这样一段话: xxx今年xx岁
#字符串拼接 变量="${}今年${}岁"
name=xiaoxin
age=16
result="${name}今年${age}岁"
echo $result
3.获取字符串长度 echo ${#字符串变量}
```shell
str1="ab.cd"
echo ${#str1} # 输出4
```
str1='hello world'
echo ${#str1}
4.字符串提取。 echo ${变量名:第几个开始:取几位数}
```shell
# 字符串:下标:个数 --从字符串中指定下标开始获取指定个数字符,返回一个新的字符串
# 字符串:下标:1 -- 获取字符串中指定下标对应的字符
# 字符串:下标 -- 从指定下标开始获取到字符串最后
string='hello world'
echo ${string:1:4} # ello
```
echo ${字符串变量:索引值:个数}
str='hello'
echo ${str:0:3} 从str中,第0个也就是h开始 一共取三个。
6.shell数组 (可用于同时保存多个数据)
1.在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
```shell
# 数组名=(元素1 元素2 元素3 ...)
names=(小明 小红 大黄 Tom)
names2=(
'小明'
'小红'
'大黄'
'Tom'
)
names3[0]=小明
names3[1]=小红
names3[2]=大黄
names3[3]=Tom
```
举例
array=(英雄联盟 csgo 红色警戒 我被美女包围啦 炉石传说). : 创建一个数组
echo ${array[1]} $disige :获取数组第二个元素
echo ${array[*]} :获取数组所有元素
2.获取数组的长度
```shell
nums=(100 200 300 400)
# 获取数组长度
length=${#nums[@]}
length=${#nums[*]}
# 获取数组指定下标对应的元素的长度
length2=${#num[n]}
```
举例
array=(英雄联盟 csgo 红色警戒 我被美女包围啦 炉石传说)
echo ${#array[*]} :获取数组的长度
7.运算符
shell中支持的运算符有: 算术运算符、关系运算符、布尔运算符、字符串运算符
1.算术运算符:+,-,\*,/,%
当运算对象和和运算结果都是整数:
加法: echo `expr 10 + 20`
乘法: echo `expr 10 \* 20`
减法:echo `expr 10 - 20`
除法:echo `expr 10 / 20`
整除:echo `expr 10 % 20`
当运算对象和和运算结果存在小数时:
echo `echo "scale=4;13.4 / 2.5"|bc` 计算13.4/2.5 并把计算结果保留4位小数。
老师的板书
```shell
# 如果想要在shell完成数值运算,运算的语法: `expr 运算表达式`; 并且运算符两边必须加空格
re1=10+20
echo ${re1} # 10+20
1.加法运算
re2=`expr 10 + 20`
echo ${re2} # 30
2.减法运算
re3=`expr 10 - 20`
echo ${re3} # -10
3.乘法运算
re4=`expr 10 \* 20` # 注意:使用*作为乘法运算符的时候需要前面加\
echo ${re4} # 200
4.除法运算
# 小数除法运算: `echo "scale=小数点位数;数值1 / 数值2"|bc`
# 整数除法运算: `expr 数值1 / 数值2`
re5=`echo "scale=2;7 / 3"|bc`
echo $re5
re6=`expr 5 / 2`
echo $re6
5.求余数
re7=`expr 10 % 3`
re8=`echo "10.2 + 5.1"|bc`
echo $re8
```
2. 关系运算符(比较运算符),比较的是数字大小
注意:关系运算符对应的运算表达式只能作为条件语句放在if 或者while 后面
```shell
# -eq --- 等于,相当于 == equal
# -ne --- 不等于,相当于!= none equal
# -gt --- 大于 greater than
# -lt --- 小于 less than
# -ge --- 大于等于
# -le --- 小于等于
# 使用语法: [ 值1 关系运算符 值2 ]
a=100
b=10
# 关系运算符要配合if语句或者循环语句使用
if [ $a -gt $b ]
then
echo a大于b
else
echo a不大于b
fi
```
3.布尔运算符(逻辑运算符)
```shell
# ! -- 逻辑非运算
# -o -- 逻辑或运算
# -a -- 逻辑与运算
判断是否为闰年:
echo -n 请输入一个年份判断是否为闰年
read year
if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 -o `expr $year % 400` -eq 0 ]
then
echo $year是闰年
else
echo $year不是闰年
fi
4.字符串运算符
```shell
# [ 字符串1 = 字符串2 ] -- 判断两个字符串是否相等
# [ 字符串1 != 字符串2 ] -- 不相等
# [ -z 字符串] -- 判断字符串长度是否为0
# [ -n "字符串" ] -- 判断字符串长度是否不为0
# [ $ 字符串 ] -- 判断字符串是否是空串
a="abc"
b="123"
if [ $a = $b ]
then
echo a和b相等
else
echo a和b不相等
fi
a=""
if [ -n "${a}" ]
then
echo a的长度不为0
else
echo a的长度为0
fi
```
5. if语句
```shell
语法1:
if 条件语句
then
满足条件执行的代码
fi
语法2:
if 条件语句
then
满足条件执行的代码
else
不满足条件执行的代码
fi
语法3:
if 条件语句1
then
代码块1
elif 条件语句2
then
代码块2
elif 条件语句3
then
代码块3
else
代码块N
fi
```