一篇博客学会shell

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇博客学会shell相关的知识,希望对你有一定的参考价值。

通过本章学习我们可以学会以下内容:

一 什么是shell以及shell的好处

二 shell脚本的格式以及变量的使用方法

三 test测试语句和if流程控制

四 case-for-while语句的使用方法

五 中双小括号的使用方法

六 循坏嵌套使用方法

七 shell之break-continue



一 什么是shell以及shell的工作方式:

shell简单来说可以当做人与计算机之间的翻译官,他作为用户与linux系统内部的通信媒介,除了能够支持各种变量与参数外,还可以提供循坏、分之等高级编程语言才有的控制结构特性。

shell的工作方式有二种:

交互式:用户每输入一条命令就立即执行。

批处理:用户先编好一个完整的shell脚本,shell会一次执行脚本的多个命令。


二 shell脚本的格式以及变量的使用方法

创建shell脚本的步骤:

第一步:创建一个包含命令和控制结构的shell文件,一般是后缀.sh

第二部:修改文件的权限使它可以执行,一般使用chmod U+x 再加文件名

第三步:执行脚本
        方法一: ./加脚本名称(常用这一种)

        方法二:使用绝对路径

        方法三:bash加文件名

举例说明:

创建一个脚本,查询一下他的路径和包含的文件内容。

  1. [[email protected] jiaoben]# vim example01.sh   创建脚本名称

  2. [[email protected] jiaoben]# chmod +x example01.sh加上执行权限

  3. [[email protected] jiaoben]# ./example01.sh   运行脚本

  4. our first example


  5. we are currently in the following directory.

  6. /root/jiaoben


  7. this directory contains the following files

  8. example01.sh

  9. [[email protected] jiaoben]# cat example01.sh查看脚本内容

  10. #!/bin/bash

  11. #this is to show what a example looks like.

  12. echo "our first example"

  13. echo # this inserts an empty line in output .

  14. echo "we are currently in the following directory."

  15. pwd

  16. echo

  17. echo "this directory contains the following files"

  18. ls



变量的使用方法:

用户定义变量:由字母或者下划线开头,由字母或者下划线组成,大小写字母意义不同,变量长度没有限制。

使用变量值时:要在变量名前加上前缀"$"

举例说明:2VAR就是非法变量

变量赋值:赋值号 = 二边没有空格

举例说明:

[[email protected] ~]# A=aaa变量赋值这种正确的

[[email protected] ~]# A = AAA  这种错误

-bash: A: command not found

[[email protected] ~]# echo $A 使用变量

aaa

[[email protected] ~]# A=`date` 将一个命令的执行结果赋予变量注意加``

[[email protected] ~]# echo $A

Thu Mar 22 10:33:58 CST 2018

[[email protected] ~]# B=$(ls -l)

[[email protected] ~]# echo $B

total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye

[[email protected] ~]# A=$B

[[email protected] ~]# echo $A

total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye

[[email protected] ~]# A=date    看这里不加``会有什么后果

[[email protected] ~]# echo $A

date    只输出date

这里要说一下单引号和双引号的区别:

单引号之间的内容原封不动的指定给了变量

双引号取消了空格的作用,特殊符号的含义保留。

列出所有的变量用set

 

位置变量和特殊变量


位置变量:shell 解释执行用户的命令时,将命令执行的第一个字作为命令名,而其他字作为参数,由出现在命令行上的位置确定的参数称为位置参数。位置变量:使用$N来表示。

举例说明:

[[email protected] ~]# ./example.sh file1 file2 file3

$0 这个程序的文件名 example.sh

$n 这个程序的第n个参数值。n=1..n

特殊变量:

有些变量一开始执行脚本的时候就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量,这些变量当一执行程序就有了,以下是一些特殊变量:

$*这个程序的所有参数

$#这个程序参数的个数

$$这个程序的PID

$!执行上一个后台程序的PID

$?执行上一个指令的返回值

举例说明写一个脚本表示出程序的所有参数进程ID和程序参数的个数。

  1.  [[email protected] jiaoben]# vim z.sh

  2. [[email protected] jiaoben]# chmod +x z.sh

  3. [[email protected] jiaoben]# ./z.sh

  4. 表示这个程序的所有参数

  5. 0 表示这个程序的参数的个数

  6. 3486 表示程序进程的ID

  7. 3488 执行上一个就太指令的PID

  8. 3486 表程序的进程ID

  9. [[email protected] jiaoben]# ./z.sh aaa bbb ddd  cccc加入一些参数

  10. aaa bbb ddd cccc 表示这个程序的所有参数

  11. 4 表示这个程序的参数的个数

  12. 3489 表示程序进程的ID

  13. 3491 执行上一个就太指令的PID

  14. 3489 表程序的进程ID

  15. [[email protected] jiaoben]# cat z.sh查看脚本

  16. #!/bin/bash

  17. echo "$* 表示这个程序的所有参数"

  18. echo "$# 表示这个程序的参数的个数"



  19. touch /tmp/a.txt

  20. echo "$$ 表示程序进程的ID"



  21. touch /tmp/b.txt &

  22. echo "$! 执行上一个就太指令的PID"

  23. echo "$$ 表程序的进程ID"



三 test测试语句和if流程控制

&& 代表条件性的AND

|| 代表条件性的OR

test也可以写成[]

数值测试:-gt 是否大于

          -ge 是否大于等于

          -eq 是否等于

          -ne 是否不等于

          -lt 是否小于

          -le 是否小于等于

IF语法:

if条件

then

语句

fi

 扩展; 分号,表示二个命令写在一行,互不影响。

if语法:

if 条件 ;then

  命令1

else

  命令2

fi

举例说明;写一个脚本,可以判断他是目录,或者是普通文件,或者是设备文件。

  1. [[email protected] ~]# vim fuza.sh

  2. [[email protected] ~]# chmod +x fuza.sh

  3. [[email protected] ~]# ./fuza.sh

  4. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  5. input a file name

  6. /etc

  7. /etc is a dir

  8. [[email protected] ~]# ./fuza.sh

  9. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  10. input a file name

  11. /etc/passwd

  12. /etc/passwd is file

  13. [[email protected] ~]# ./fuza.sh

  14. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  15. input a file name

  16. hhhk

  17. hhhk is an unknow file

  18. [[email protected] ~]# ./fuza.sh

  19. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  20. input a file name

  21. /dev/sda

  22. /dev/sda is a device file

  23. [[email protected] ~]# cat fuza.sh

  24. i#/bin/bash

  25. echo "input a file name"

  26. read file_name

  27. if [ -d $file_name ] ; then

  28. echo "$file_name is a dir"

  29. elif [ -f $file_name ] ;then

  30. echo "$file_name is file"

  31. elif [ -c $file_name -o -b $file_name ] ; then

  32. echo "$file_name is a device file"

  33. else

  34. echo "$file_name is an unknow file"

  35. fi


四 case-for-while语句的使用方法

case: 流程控制语句,适用于多分支。

格式:

case 变量 in

字符串1)命令列表1

;;

....

字符串n)命令列表n

;;

esac

技术分享图片


举例说明:

制作一个菜单,可以选择bcd,分别代表backup copy delete

技术分享图片

文字部分

  1. [[email protected] lianxi]# vim case.sh

  2. [[email protected] lianxi]# chmod +x case.sh

  3. [[email protected] lianxi]# ./case.sh

  4. ****************************

  5. Please selet you operation:

  6. 1 Copy

  7. 2 Delete

  8. 3 Backup

  9. *****************************

  10. C

  11. your seletion is copy

  12. [[email protected] lianxi]# ./case.sh

  13. ****************************

  14. Please selet you operation:

  15. 1 Copy

  16. 2 Delete

  17. 3 Backup

  18. *****************************

  19. D

  20. your seletion is delete

  21. [[email protected] lianxi]# ./case.sh

  22. ****************************

  23. Please selet you operation:

  24. 1 Copy

  25. 2 Delete

  26. 3 Backup

  27. *****************************

  28. B

  29. your seletion is backup

  30. [[email protected] lianxi]# cat case.sh

  31. #!/bin/bash

  32. echo "****************************"

  33. echo "Please selet you operation:"

  34. echo " 1 Copy"

  35. echo " 2 Delete"

  36. echo " 3 Backup"

  37. echo "*****************************"

  38. read op

  39. case $op in

  40. C)

  41. echo "your seletion is copy"

  42. ;;

  43. D)

  44. echo "your seletion is delete"

  45. ;;

  46. B)

  47. echo "your seletion is backup"

  48. ;;

  49. *) # 参数*, 匹配所有参数。

  50. echo "invalide selection"

  51. ;;

  52. esac


whlie 是循坏语句,用在循坏中

格式:

while 条件

do

命令

done

话不多说,继续举例说明:

算出一到十的平方,用脚本写出来。

脚本内容:

技术分享图片

文字说明:

  1. [[email protected] ~]# vim pingfang.sh

  2. [[email protected] ~]# chmod +x pingfang.sh

  3. [[email protected] ~]# ./pingfang.sh

  4. 1

  5. 4

  6. 9

  7. 16

  8. 25

  9. 36

  10. 49

  11. 64

  12. 81

  13. 100

  14. [[email protected] ~]# cat pingfang.sh

  15. #!/bin/bash

  16. num=1

  17. while [ $num -le 10 ]

  18. do

  19. square=`expr $num \* $num`

  20. echo $square

  21. num=`expr $num + 1`

  22. done

五 中双小括号的使用方法

使用(())扩展shell中算数运算的使用方法,使用[]的时候,必须保证运算符与算数之间有空格,四则运算也只能借助expr命令来完成,我们今天的说的(())结构语句,就是对shell中算数及赋值运算的扩展。

举例说明:

依次输出小于100以内2的幂值,输出的结果应该为:2 4 8 16。

脚本的内容:

技术分享图片

文字解释:

  1. [[email protected] ~]# vim mizhi.sh

  2. [[email protected] ~]# chmod +x mizhi.sh

  3. [[email protected] ~]# ./mizhi.sh

  4. the while loop example

  5. value of the variable is : 1

  6. value of the variable is : 2

  7. value of the variable is : 4

  8. value of the variable is : 8

  9. value of the variable is : 16

  10. value of the variable is : 32

  11. value of the variable is : 64

  12. the loop execution is finished

  13. [[email protected] ~]# cat mizhi.sh  查看一下脚本内容

  14. #!/bin/bash

  15. echo "the while loop example"

  16. echo

  17. var1=1

  18. while ((var1<100))  注意这里可以省去$

  19. do

  20.       echo "value of the variable is : $var1"

  21.     ((var1=var1*2))  这里也是可以省去$

  22. done

  23. echo

  24. echo "the loop execution is finished"


 六 循坏嵌套使用方法

顾名思义就是在一个脚本中使用循坏嵌套来实现更简单的用法。

举例说明;使用特殊符号打印三角形。要求整个程序要有交互,运行时可以自动输入打印的行数和用于描绘三角形的特殊符号。

脚本内容:

技术分享图片


文字解释

  1. [[email protected] ~]# vim sanjiao.sh

  2. [[email protected] ~]# chmod +x sanjiao.sh

  3. [[email protected] ~]# ./sanjiao.sh

  4. please enter the line number:6

  5. please enter the char number:*

  6. *

  7. **

  8. ***

  9. ****

  10. *****

  11. ******

  12. [[email protected] ~]# cat sanjiao.sh

  13. #!/bin/bash

  14. read -p "please enter the line number:" line

  15. read -p "please enter the char number:" char

  16. a=1

  17. while [ $a -le $line ]

  18. do

  19.       b=1

  20.       while [ $b -le $a ]

  21.     do

  22.         echo -n "$char"

  23.         b=`expr $b + 1`

  24.     done

  25.     echo

  26.     a=`expr $a + 1`

  27. done

  28. [[email protected] ~]#



写了这么多,你也看出来了。没有什么捷径,捷径就是一天一个脚本,早晚你就会成功。

以上是关于一篇博客学会shell的主要内容,如果未能解决你的问题,请参考以下文章

一篇博客让你学会部署社交网站( SVN+nginx+PHP+MySQL+MFS 内含所有源码包)

让代码优雅起来(学会调试+代码风格)

php利用root权限执行shell脚本 (转)

一篇学会java调用Keycloak Admin-cli User和Group Api

一篇学会java调用Keycloak Admin-cli User和Group Api

MyBatis实现对数据库的增删改查