一、shell编程
1.概念
把在终端下执行的LInux命令保存到文件中,这个文件就被称为shell程序
简单的说:shell编程就是对一对Linux命令的逻辑化处理
由于免费和简单易用,bash在工作中被广泛使用,bash也是大多数LInux默认的shell
shell的解析器:ash,bash,ksh,csh等,默认bash
echo $SHELL
shell的作用:
a.节省工作时间
b.提高工作效率
2.第一个shell程序
特点:扩展名为.sh【pycharm.sh】
文件名尽量遵循标识符的规则【全英文/英文 + 数字】
代码:
#!/bin/bash echo "hello world"
运行方式:
rock@rockrong:~$ cd Desktop/ rock@rockrong:~/Desktop$ mkdir shellPro rock@rockrong:~/Desktop$ cd shellPro/ rock@rockrong:~/Desktop/shellPro$ touch first.sh rock@rockrong:~/Desktop/shellPro$ vim first.sh rock@rockrong:~/Desktop/shellPro$ ll 总用量 12 drwxrwxr-x 2 rock rock 4096 8月 23 09:46 ./ drwxr-xr-x 3 rock rock 4096 8月 23 09:44 ../ -rw-rw-r-- 1 rock rock 32 8月 23 09:46 first.sh rock@rockrong:~/Desktop/shellPro$ chmod a+x first.sh rock@rockrong:~/Desktop/shellPro$ ll 总用量 12 drwxrwxr-x 2 rock rock 4096 8月 23 09:46 ./ drwxr-xr-x 3 rock rock 4096 8月 23 09:44 ../ -rwxrwxr-x 1 rock rock 32 8月 23 09:46 first.sh* rock@rockrong:~/Desktop/shellPro$ first.sh first.sh:未找到命令 rock@rockrong:~/Desktop/shellPro$ ./first.sh hello world rock@rockrong:~/Desktop/shellPro$ /bin/bash first.sh hello world rock@rockrong:~/Desktop/shellPro$ sh first.sh hello world rock@rockrong:~/Desktop/shellPro$ touch varDemoo01 rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 rock@rockrong:~/Desktop/shellPro$ sh varDemo01 sh: 0: Can't open varDemo01 rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 name rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 zhangsan 18 rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 zhangsan 18 zhangsan his name is zhangsan lisi rock@r
3.shell基本语法
3.1变量
定义:变量名=值
普通变量
只读变量:readonly xxx,只能获取,不能重新赋值
删除变量:unset xxx,变量被删除之后将不能使用,注意:只读变量不能删除【删除变量的特点:不会报错,会输出空内容】
#!/bin/bash #变量的定义 name="zhangsan" age=18 echo $name echo $age #建议书写成标准写法 echo ${name} echo "his name is ${name}" #重新赋值 name="lisi" echo ${name} #只读变量 num=10 echo $num #readonly num num=20 #删除变量 url="www.baidu.com" unset url echo $url
3.2字符串
【面试题:区分shell中的单引号,双引号和反引号】
单引号:其中的任何字符都会原样输出,而且单引号中的变量是无效的,单引号中不能使用单引号【即使使用\转义也不行】
双引号:跟Python类似,表示一个普通的字符串,可以包含大多数的特殊字符【除$,·,,"之外】
反引号:将其中的内容作为命令执行
注意:在shell的字符串中,也可以使用\进行转义
#!/bin/bash #定义字符串 str1="hello" str2="${str1} world" str3="\"${str1}\" world" echo $str1 echo $str2 echo $str3 #拼接字符串 echo $str2 $str3 #获取字符串的长度 echo "str1的长度为:${#str1}" #提取子字符串 s1="abcdef12536124" echo ${s1:1:4} #反引号 echo 'expr 2+3' echo "expr 2+3" #注意:expr是一个命令,表示一条语句,会进行指定的运算 #注意:2 + 3必须出现空格 echo `expr 2 + 3` #查找子字符串 #注意:index的作用:获取一个子字符串在源字符串中第一次出现的位置 s2="this is a test" echo `expr index "$s2" is`
3.3数组array
bash支持一维数组【不支持多维数组】,并且没有设定数组的大小
数组元素的下标从0开始的,通过下标获取数组中的元素,
定义:数组名=(元素1 元素2 元素3…)
注意:元素之间使用空格隔开
工作原理:bash中的数组类似于c语言中数组,数组名称相当于是一个指针,默认指向数组中第0个下标对应的元素
#:获取长度,相当于len */@:代表所有,表示可以获取数组中的所有元素 #!/bin/bash #定义数组 arr1=(1 2 3 4) arr2=( 10 20 30 40 ) echo $arr1 echo $arr2 #获取数组中的元素 echo ${arr2[2]} #获取数组中的全部元素 echo ${arr2[@]} echo ${arr2[*]} #获取数组的长度 echo ${#arr2[*]} echo ${#arr2[2]}
3.4运算符
a.基本运算符 算术运算符:+ - \* / % 关系运算符:> < == -gt[greater than] -lt[less than] -ge -le -eq 逻辑运算符:&&【与】 ||【或】 !【非】 b.文件检测运算符 -r:文件是否可读 -w;文件是否可写 -f:路径是否是文件【isfile】 -d:路径是否是目录【isdir】 -e:路径是否存在【exits】 #!/bin/bash file="/home/rock/Desktop/shellPro/first.sh" if [ -e $file ]; then echo "是存在的" fi if [ -f $file ]; then echo "是文件" fi if [ -w $file ]; then echo "是可写的" fi
3.5echo、test、printf命令
#-e表示开启转义,\n表示换行,\c表示不换行 echo -e "xxx \n" echo -e "xxx \c" #!/bin/bash echo "afha" echo fhajhfja echo `date` echo `cal` echo -e "ok \n" echo "this is a text" echo -e "ok~~~\c" echo "this is a text"
printf不会像echo进行自动换行,可以对数据进行格式化
%s:字符串 %c:字符 %d:整型 %f:浮点型 %-10s:指定一个宽度为10的字符串,-表示左对齐,没有则表示右对齐,任何字符都会显示在10个字符范围内,如果不足则使用空格填充 %-4.2f:指的是格式化小数,其中.2表示保留小数点后2位 #!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 年龄 体重 printf "%-10s %-8s %-4.2f\n" zhangsan 10 172.8977 printf "%-10s %-8s %-4s\n" 姓名 年龄 188.9 printf "%-10s %-8s %-4s\n" 姓名 年龄 176.44
test:用于检测某个条件是否成立,他可以进行数字,字符和文件的三种检测
!/bin/bash num1=100 num2=200 if [ $num1 -eq $num2 ]; then echo "相等" fi if [ $num1 == $num2 ]; then echo "相等" fi if test $num1 -eq $num2; then echo "ok" fi str1="abc" str2="abc" if [ $str1 == $str2 ]; then echo "1111" fi if test $str1 == $str2; then echo "2222" fi cd /home if test -e ./rock; then echo "存在" fi
3.6流程控制语句
a.分支语句
if语句
case语句
!/bin/bash echo "请输入1到4的数字:" echo "你输入的数字为:" read num #注意:case可以和if多分支进行等价转换 case $num in 1) echo "1111" ;; 2) echo "2222" ;; 3) echo "333" ;; 4) echo "4444" ;; *) echo "输入有误" ;; esac if [ $num == 1 ] then echo "111" elif [ $num == 2 ] then echo "222" else echo "输入有误" fi
#练习 #1.从终端输入一个数,判断该数是否是偶数 #2.从终端输入一个数,输出对应的星期英文
b.循环语句
for循环
while循环
until循环
!/bin/bash #for循环 #遍历数组 arr1=(34 546 6 76) for num in ${arr1[*]} do echo "for语句:${num}" done for num in 34 546 6 76 do echo "arr:${num}" done #遍历字符串 for s in "this is a text" do echo ${s} done #while循环 #需求:打印1~5的数字 n1=1 while [ $n1 -le 5 ] do echo $n1 let "n1++" done n2=1 while (($n2<=5)) do echo $n2 n2=$[$n2+1] done n3=1 while [ $n3 -le 5 ] do echo $n3 ((n3++)) done #until i=1 until [ $i -gt 5 ] do echo "until:$i" ((i++)) done #练习:求1~100之间所有整数的和 num=1 total=0 while [ $num -le 100 ] do total=$[$total+$num] num=$[$num+1] done echo $total
3.7函数
#!/bin/bash #无惨无返回值函数 func1() { echo "hello" } #调用函数:只需要书写函数名即可 func1 #返回值 #需求:从控制台read进来两个数,求两个书的和 total() { echo "该函数对两个书进行求和运算" echo "请输入第一个数:" read num1 echo "请输入第二个数:" read num2 # sum=$[$num1+$num2] return $(($num1+$num2)) } total #获取一个函数的返回值,通过$?获取 echo "输入的两个数字之和为:$?" #有参数 #参数用$1 $2。。。表示 func2() { echo "该函数用于求和" echo $1 echo $2 return $(($1+$2)) } func2 23 6 echo "和:$?"
4.练习
#1.书写脚本,判断传入的参数的个数 #!/bin/bash num=$# echo $num #2.书写脚本,把命令行传入的两个参数比较,相等输出equal #!/bin/bash if test $# -eq 2 then if test $1 -eq $2 then echo "相等" else echo "不相等" fi else echo "参数个数不是两个" fi #3.书写脚本,以指定目录为参数,生成该目录的压缩备份 #!/bin/bash path=$1 if [ -e $path ] then if [ -d $path ] then gzip -r $path else gzip $path fi else: echo "路径不存在" fi #4.遍历数组中的所有元素 #!/bin/bash arr1=(43 5 6) for num in ${arr1[*]} do echo $num done #5.求数组中的元素之和 #!/bin/bash arr1=(43 5 6) total=0 for num in ${arr1[*]} do total=$[$total+$num] done echo $total arr1=(43 5 6) total=0 i=0 while [ $i -lt ${#arr1[@]} ] do total=$[$total+${arr1[$i]}] i=$[$i+1] done echo $total #6.书写脚本,往mylog.log文件中追加信息“this is a text” #!/bin/bash #sed -i '/$/a\this is a text' mylog.log #问题:会在匹配到的每一行的行尾追加内容 echo "this is a text" >> mylog.log #7.定义函数,生成n~m的连续整数 #!/bin/bash echo $RANDOM #生成0~32767之间的整数随机数 func() { min=$1 max=$(($2-$min+1)) num=$(($RANDOM+100000000)) return $(($num%$max+$min)) } func 10 100 echo $? #8.某log文件有很多行,每行输出包含info/debug/error字样,书写脚本,将log文件名当参数输入,统计包含error的行有多少行 #!/bin/bash path=$1 cat $path | grep -c error #9.书写脚本,实现git文件的提交和推送过程 #!/bin/bash #需要add的文件名称 path=$1 #提交的日志 log=$2 #推送到远程分支 branch=$3 echo "开始添加。。。。" git add $path echo "添加成功!" echo "开始提交。。。。" git commit -m $log echo "提交成功!" echo "从远程仓库进行抓取。。。" git pull echo "抓取成功!" echo "开始推送。。。。" git push origin $branch echo "推送成功!" #运行:/bin/bash xxxx.sh a1.txt "create a1 file" master