周口网站优化,网站设计协议,网站外链建设实例,有域名怎么发布网站吗1. shell脚本基础概念
1.1概念 shell使用方式#xff1a;手动下命令和脚本 脚本本质是一个文件#xff0c;文件里面存放的是特定格式的指令#xff0c;系统可以使用脚本解析器翻译或解析指令并执行#xff08;它不需要编译#xff09;。 shell脚本本质#xff1a;shell命…1. shell脚本基础概念
1.1概念 shell使用方式手动下命令和脚本 脚本本质是一个文件文件里面存放的是特定格式的指令系统可以使用脚本解析器翻译或解析指令并执行它不需要编译。 shell脚本本质shell命令的有序集合扩展名可以为sh见名知意也可以没有。 shell 既是应用程序又是一种脚本语言应用程序 解析 脚本语言。 编译型语句编译器gcc, g 解释型语句不需要编译解释一条执行一条python、shell脚本。 1.2创建和执行 新建一个shell脚本: touch xx.sh 第一行为 #!/bin/bash 意思是使用/bin/bash来解释执行 执行方式 sudo chmod 权限 xx.sh #使脚本具有执行权限./xx.sh #执行脚本 练习 1在当前路径下创建file_1到file_5, 5个普通文件 2删除 file_2和file_3文件使用通配符) 3将剩下的file文件用tar压缩成bz2的格式 4将压缩文件复制到家目录下 5进入到家目录解压压缩文件 6删除压缩包 2.变量
2.1用户自定义变量 名命一般用大写 进行赋值时用左右两边不能有空格 引用变量在变量名前面加$ 2.2位置变量 $0或者${0}代表包含脚本文件名的命令行参数./xx.sh $1$2...代表第二个命令行参数、第三个命令行参数以此类推 $# 代表命令行参数个数(不包含第一个也就是带脚本名的命令行参数) $或者$* 代表所有命令行参数(不包含第一个也就是带脚本名的命令行参数) 2.3预定义变量 $? 代表前一个命令的退出状态(0为真非0为假) $$ 代表执行进程的ID号 2.4环境变量 变量没有类型都看作是字符串。 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数如临时文件夹位置和系统文件夹位置等。 HOME /etc/passwd文件中列出的用户主目录 PATH shell搜索路径就是是一系列目录当执行命令时linux就在这些目录下查找。 3.功能语句
3.1说明性语句 以#开头 注释用# 3.2功能性语句
3.2.1 read 功能read从标准输入读入一行并赋值给后面的变量 格式read 变量列表 把读入行中的第一个单词赋值给第一个变量第二个单词赋值给第二个变量以此类推 read -p 提示语句 变量列表 可以将提示语句输出同时输入变量 3.2.2 expr expr 表达式 注意表达式符号之间必须有空格元素引用用$ 可以直接输出结果不过脚本里一般结合命令置换符把结果重新赋值给其他变量 算术运算符命令expr主要用于进行简单的整数运算包括加()、减-、乘\*)、整除/和取余数%等操作。注意小圆括号()前面也要加转义符\。 例子 练习1通过expr实现变量自加运算i 练习2计算表达式值a*bc-d/b,a2b3c15,d18 要求 1从终端读入4个数a,b,c,d 2进行运算 3打印结果输出到终端 #!/bin/bashI0
#Iexpr $I 1
((I ))
echo $Iread -p input: a b c d
#NUMexpr $a \* $b $c - $d / $b
((NUMa*bc-d/b))
#NUM$((a*bc-d/b))
echo $NUM 也可以用(())进行数学运算 3.2.3 let let 表达式 3.2.4 test 可测试对象三种字符串 整数 文件属性 每种测试对象都有若干测试操作符 1字符串的测试 s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是否为0 -n s1 测试s1 字符串的长度是否不为0 2整数的测试 a -eq b 测试a 与b 是否相等 equal a -ne b 测试a 与b 是否不相等 not equal a -gt b 测试a 是否大于b greater than a -ge b 测试a 是否大于等于b greater equal a -lt b 测试a 是否小于b litter than a -le b 测试a 是否小于等于b litter equal 3文件属性的测试 -d name 测试name 是否为一个目录 -f name 测试name 是否为普通文件 -e name 测试文件是否存在 #!/bin/bash#测试字符串
VARhello
test $VAR hello
echo $?test $VAR ! hello
echo $?test -z $VAR
echo $?test -n $VAR
echo $?#测试整数
test 10 -eq 5
echo $?test 10 -ne 5
echo $?test 10 -gt 5
echo $?test 10 -lt 5
echo $?#测试文件属性
read -p input filename: FILE
test -e $FILE
echo $?test -f $FILE
echo $?test -d $FILE
echo $? 3.3结构性语句
3.3.1 if语句 基本结构: if 条件then命令表1else命令表2fi 多路分支结构 if 条件1
then命令表1
elif 条件2
then命令表2
fi 嵌套结构 if 条件1
thenif 条件2then命令表1fi
else命令表2
fi 例子: 补充操作符 -o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true -a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false 非运算 例如 [ ! false ] 返回 true 逻辑与 例如 [[ $a -lt 100 $b -gt 100 ]] 返回 false || 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true | 位或 例如 echo $[2|2] 位与 例如 echo $[21] 3.3.2 case语句 格式 case 变量 in
模式1命令表1;;
模式2)命令表2;;
*)命令表n;;
esac 例子 练习学生成绩管理系统用shell中的case实现 90-100A 80-89B 70-79C 60-69D 60不及格 #!/bin/bashread -p input score: SCORE
case $SCORE in
100|9[0-9])echo A;;
8[0-9])echo B;;
7[0-9])echo C;;
6[0-9])echo D;;
[0-9]|[1-5][0-9])echo lost;;
*)echo input err;;
esac3.3.3 for循环 格式 for 变量名 in 单词表
do命令表
done 变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。 例子: for语句的几种书写格式 1for i in 1 2 3 4 do....done : 变量i从单词表中取值 2for i do...done 变量i从命令行取值可以省略in单词表 3for i in {1..10} do...done: 变量i从1-10个数中取值 4for ((i 0; i 10; i)) do...done: 书写格式类似c语言 3.3.4 while 格式 while 命令或表达式
do命令表
done while语句首先测试其后的命令或表达式的值如果为真就执行一次循环体中的命令然后再测试该命令或表达式的值执行循环体直到该命令或表达式为假时退出循环。 练习分别用for和while实现1-10求和 #!/bin/bashi1
SUM0
while test $i -le 10
do#((SUMSUMi))#SUMexpr $SUM $ilet SUMSUMi((i))
done
echo $SUMSUM0
##################################
for ((i1;i10;i))
do((SUMSUMi))
done
echo $SUM3.3.5 循环控制语句 break n: 结束n层循环 continu n: 结束n层的本次循环继续下一次循环 #!/bin/bashfor ((i0;i5;i))
dofor((j0;j5;j))doif [ $j -eq 3 ]then #break 1#break 2#continue 1continue 2fi echo $i : $j #4 2done
done4.数组
4.1数组的赋值 a. 直接对数组赋值 arr(1 2 3 4 5) b. 把命令行参数赋值给数组 arr($1 $2 $3) c. 把元素赋值给数组 read a b c arr($a $b $c) d. 给数组元素输入赋值 read -a arr 4.2数组的调用 ${arr[i]} #访问数组元素数组下标从0开始到n-1结束 arr[i]10 #对数组元素重新赋值 ${arr[]} #遍历数组 ${#arr[]} #表示数组元素的个数 练习从终端输入3个整数输出三个数中的最小值 #!/bin/bashread -a arr
MIN${arr[0]}
n${#arr[]}
for ((i0;in;i))
doif [ $MIN -gt ${arr[i]} ]thenMIN${arr[i]}fi
done
echo $MIN冒泡排序 练习用shell脚本试下以下功能 判断当前路径下是否存在目录aa如果不存在创建遍历当前路径下的文件如果是普通文件将文件复制到aa目录下并计算文件的个数。 #!/bin/bashif [ -d aa ] #如果当前目录下有aa目录就删除然后创建
thenrm -r aa
fimkdir aanum0
filelistls #将当前目录下所有文件赋值给filelist变量
for file in $filelist #for file in * #用file遍历当前目录下所有文件
doif [ -f $file ] #如果是普通文件就复制到aa目录下thencp $file ./aa ((num)) #计算文件个数fi
done
echo $num