一、简述
1、概念:shell脚本用于接受用户命令,识别命令,执行命令并将结果返回给用户,编写用来控制系统的自动化脚本。
2、shell脚本的第一行表明使用哪一个shell的解释器,第一行写法: #!/bin/bash
3、为了方便识别shell脚本,所以shell脚本一般以.sh结尾,但不是必须以.sh结尾
4、执行方式,shell脚本的执行方式分为两种
a、有执行权限时可直接通过 ./文件名 去执行shell脚本
b、无执行权限时可通过 /bin/bash 文件名 去执行shell脚本
注:可自行给shell文件添加执行权限,可通过chmod a+x 文件名添加执行权限
5、shell脚本的注释行是给最开头加上#代表注释,注意:不能分行使用
二、shell变量
1、概念:变量自定义,用来保存数据,变量要有名称,用来区分和定位变量名(注:shell变量名定义与其他语言变量名定义的区别等号两侧不能有空格)
例:num=10
2、使用变量时,要在变量名前加上$符号,若变量名后有其他内容,要将变量名用{}引用,便于变量名区分(最好每个变量名都带{},防止出错)
第一步:创建shell脚本文件
第二步:按a/i进入编辑模式,首行添加注释器
第三步:定义变量,打印变量值
第四步:按esc退出编辑模式,进入末行模式,按输入:x或:wq 退出并保存
第五步:当前我们没有权限去执行这个文件,所以可以通过/bin/bash demo.sh去执行文件
也可给文件增加执行权限后通过./demo.sh执行文件
以上就是编写执行一个shell脚本的完整流程
3、readonly 设置变量为只读,更改后会报错
4、字符串的一些简单操作
a、拼接字符串,建议直接使用双引号拼接字符串
b、获取字符串长度:
通过${#变量名}获取字符串长度
注:数字长度会将数字转换为字符串后获取长度,以上方法按照字符数进行计算
c、截取字符串:
通过下标截取字符串
截取字符串格式${str:初始值:末尾值}
超长情况下截取到最后
如果格式为${str:初始值}则默认从初始值截取到最后
三、数组操作
1、数组下标从0开始,一组有共同名字的数据,通过下标来区分
2、shell中怎么去定义一个数组:
arr=(值1 值2 值3 值4 值5......)
注意在其它语言中数组定义值和值之间可能通过“,”去分隔,但在shell中数组定义用“ ”空格去分隔
shell中数组定义也可以通过arr[下标]=值去定义,但不建议
3、获取数组中的值可通过${arr[下标]}去获取数组中的值
例:
4、输出数组的所有内容可通过${arr[@]}或${arr[]*}去完成
5、获取数组的长度可通过${#arr[@]}
6、获取数组中单个元素的长度可通过${#arr[下标]}去完成
四、一些操作命令
1、read :从键盘标准输入,读取一行,将内容交给指定变量
-p参数:显示出提示内容
-s参数:隐藏输入内容
例1:无参数
例2:带有-p参数
例三:带有-s、-p参数
注意:多个参数时-p放到最后
2、写入文件
a、覆盖写入:>
b、追加写入:>>
3、注释:单行注释在需要注释的行的开头加上“#”代表注释这一行,代码不会执行这一行。
四、运算符
1、算数运算符:基本规则 $((表达式))
+ 、-、*、/、%、=(赋值)、==(用来比较数字)、!=(用来比较数字)
例:
注:shell中的除法不会计算小数点后,==和!=一般用于if判断中
2、关系运算符(只对数字进行比较,除非字符串的值是数字)
基本规则[ $num1 运算符 $num2 ] 注意[ ]两边空格
-eq 判断是否两个数相等
-ne 判断两个数是否不相等
-gt 判断是否大于
-ge 判断是否的大于等于
-lt 判断是否小于
-le 判断是否小于等于
3、布尔运算符
基本规则[ 条件一 运算符 条件二 ] 注意[ ]两边空格
! 非(取反)基本规则[ ! 条件 ]
-o 或(两个中有一个为真则表达式为真)
-a 与(两个同时为真时表达式结果为真)
注:以上运算符返回真假值,True或False
4、逻辑运算符
&&:逻辑与(同真为真,同假为假)
||:逻辑或(两个中只要有一个为真则为真,两个都是假则为假,同真为真)
注:基本规则[[ 表达式1 运算符 表达式2 ]] 两层[ ]
5、字符串运算符
基本规则[ str1 运算符 str2 ]
=:比较两个字符串是否相等
!=:比较两个字符串是否不相等
-z:判断字符串的长度是否为0
-n:判断字符串的长度是否不为0
变量名:检测字符串是否为空
6、文件测试符(file指文件或目录名称)
基本规则[ 运算符 $file ]
-d file:判断file是否是一个目录
-f file:判断file是否是一个文件
-r file:判断file是否可读,有一个r权限就可以
-w file:判断file是否可写,有一个w权限就可以
-x file:判断file是否可执行,有一个x权限就可以
-s file:检测文件是否为空,不为空则返回True,对文件有效,对目录无效
-e file:检测文件或目录是否存在,存在返回True,输入名称可带路径
注:以上对文件测试符号,不加路径默认是当前路径下
7、test符号:可抵消一层中括号
五、分支结构
1、简单if基本规则:
if [ 表达式 ]
then
当表达式成立时要执行的操作及语句
fi
例:
注:简单if只考虑为真不考虑为假的情况
2、常规if的基本规则:
if [ 表达式 ]
then
当表达式成立时要执行的操作及语句
else
当表达式不成立时要执行的操作或语句
fi
例:
因为num1大于num2结果为假所以输出else中的语句块
3、多重if基本规则
if [ 表达式1 ]
then
当表达式1成立时要执行的操作及语句
elif [ 表达式2 ]
当表达式2成立时要执行的操作或语句
elif [ 表达式3 ]
当表达式3成立时要执行的操作或语句
................
else
当以上表达式都不成立时执行的语句
fi
例:
以游戏段位为例,积分排行
#!/bin/bash
read -p "请输入你的积分:" score
if [ $score -ge 10000 ]
then
echo "王者"
elif [ $score -ge 7000 ]
then
echo "星耀"
elif [ $score -ge 5000 ]
then
echo "钻石"
elif [ $score -ge 3000 ]
then
echo "铂金"
elif [ $score -ge 1000 ]
then
echo "黄金"
else
echo "青铜"
fi
4、嵌套if基本规则
if [ 表达式1 ]
then
表达式1成立时执行
if [ 表达式2 ]
then
表达式1成立,表达式2成立时执行的语句及操作
else
表达式1成立,表达式2不成立时执行的语句及操作
fi
else
表达式1不成立时执行的语句及操作
fi
例:以考试成绩为例
嵌套可以有多层,外层是内层执行的条件
六、循环语句
基本规则
while ((表达式))
do
满足表达式执行的语句或操作
done
例:循环输入学生成绩计算总分和平均值
#!/bin/bash
read -p "请输入班级人数:" num
i=1
total=0
while(($i<=num))
do
read -p "请输入第${i}个学生的成绩:" score
total=$((total+score))
let i++
done
echo "学生的总成绩为"${total}
echo "班级平均分为"$((total/num))
注:while循环必须有出口,用let来循环给i赋值,每循环一次i的值增加1
跳出和跳过循环:
break:跳出当前所在的循环,执行后边的语句
continue:跳过本次循环continue后边的语句,到循环开始时重新执行(不建议使用,容易造成死循环)
利用while循环来读取和写入文件:
a、读取文件
按行读取demo.txt中的文本数据,并输出
#!/bin/bash
while read line
do
echo $line
done < demo.txt
b、模拟实现linux中mv命令
在shell中$0代表当前文件,$1代表第一个参数,$2代表第二个参数,以下代码先判断有没有第二个参数,如果没有输入则参数无效,输入后防止文件名相同先删除文件,在创建新文件,然后循环覆盖写入文件,最后删除当前文件。
#!/bin/bash
if [ $2 ]
then
rm -rf $2
touch $2
while read line
do
echo $line >> $2
done < $1
else
echo "参数无效"
fi
rm -rf $1
先运行shell脚本,在后边直接写参数,第一个参数是源文件,第二个参数是移动后的文件(参数也可写成路径)
七、for循环结构
基本规则:
for((初始值;条件;运算语句))
do
程序段
done
初始值可在for循环前定义
条件和运算语句可在程序段内进行定义
注:for((;;))如果全定义完成,可用这种方式写for语句(不建议,容易造成死循环)
例:利用for循环完成99乘法
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
echo -ne "${i}*${j}=$((i*j))\t"
done
echo
done
根据上述代码完成99乘法表,-ne代表不换行且转换转义字符,\t转义字符制表符,主要用于对齐,空输echo代表换行。
for in是对数据集的简单处理
基本规则:
for 变量 in 数据集
do
程序段
done
例: 遍历数据集
#!/bin/bash
score=(90 87 89 99 98 96 95 85 92)
for i in ${score[@]}
do
echo ${i}
done