经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
入门shell脚本基础及原理
来源:jb51  时间:2021/9/6 11:52:43  对本文有异议

1.特殊变量

$#:查看变量参数的个数
$0:查看脚本的名字
$!:查看shell后台的pid
$@:查看传递脚本所有参数的列表
$*:查看所有参数的列表,单字符串形式显示
$$:脚本本身进程的ID
$?:上一条命令的结果,显示0则成功,不是0则失败

2.内部环境变量

  1. $PATH
  2. SHELL 当前使用的shell
  3. UID 当前的用户环境 {0|其它数字}={root|其它用户}
  4. HOME 当前使用的用户目录
  5. PWD 当前的目录
  6. HISTFILE 历史命令路径
  7. PS1 #[\u@\h \W]\$ 用户@主机名\目录\$

3.整数以及字符判断

3.1整数判断

  1. -eq 测试俩个整数是否相等 equal
  2. -ne 测试俩个整数是否不等 unequal
  3. -gt 测试一个数是否大于一个数 greater than
  4. -lt 测试一个数是否小于一个数 less than
  5. -ge 测试一个数大于或等于
  6. -le 测试一个数小于或等于

3.2字符测试

  1. =~ 测试是否被正则表达式匹配
  2. -z "string" 检测字符是否为空,空则真,不空则假 如: [ -z "" ]为真空则为真
  3. -n "string" 检测字符是否不空,不空则真,不空则假
  4. 字符相比较大小用[[ ]],比的是第一个字母(a-zA-Z)都是大写或者都是小写比较ascii 越大则越大
  5. 有大写又有小写则A>a B>b 但是A不大于b的情况
  6. [root@slave02 ~]# [[ "A" < "B" ]]
  7. [root@slave02 ~]# echo $?
  8. 0
  9. [root@slave02 ~]# [[ "a" < "b" ]]
  10. [root@slave02 ~]# echo $?
  11. 0

4.文件判断

  1. -e:文件是否存在
  2. -b:测试是否块设备文件
  3. -c:测试是否字符设备文件
  4. -f:测试是否普通文件
  5. -d:测试是否目录
  6. -h:测试是否符号链接文件
  7. -L:测试是否是符号链接文件
  8. -p:测试是否是命名管道文件
  9. -S:测试是否是套接字文件
  10. 权限相关:
  11. -r
  12. -w
  13. -x 执行
  14. 特殊权限
  15. -g
  16. -u
  17. -k

5.read输入

  1. 选项:
  2. -p:指定提示符
  3. -t:指定提示等待的时间(秒)

6.if判断

  1. 多分支:
  2. if [ 条件 ];then
  3. statement1
  4. .....
  5. elif [ 条件2 ];then
  6. statement2
  7. ....
  8. else
  9. statement3
  10. ....
  11. fi

7.案例选择判断

  1. case $变量名 in
  2. 'value1')
  3. statement
  4. ...
  5. ;;
  6. 'value2')
  7. statement
  8. ...
  9. ;;
  10. *)
  11. statement
  12. ..
  13. ;;
  14. esac
  15.  
  16. #case支持的通配符:
  17. * //任意长度任意字符
  18. ? //任意单个字符
  19. [] //指字范围内的任意单个字符
  20. start|START //俩种选择

8.for循环

  1. 第一种:
  2. for ((expr1;expr2;expr3)) # expr1:初始值条件
  3. #expr2:循环的范围进行退出
  4. #expr3:变量的值使用
  5. {
  6. 循环体
  7. }
  8. for ((expr1;expr2;expr3));do
  9. 循环体
  10. done
  11. 第二种:
  12. for 变量 in 列表; do
  13. 循环体
  14. done

9.while循环

  1. while循环用于不知道循环次数的场景,注意有退出条件
  2. while [ 条件 ];do
  3. statement
  4. .....
  5. done

10.深入练习

1.写一个脚本,输入三个数字进行相应的加减乘除

  1. [root@slave02 ~]# cat script01.sh
  2. #!/bin/bash
  3. a=$1
  4. b=$2
  5. c=$3
  6. num1=$[$a+$b+$c]
  7. num2=$[$a-$b-$c]
  8. num3=$[$a*$b*$c]
  9. echo "$a + $b + $c" = $num1
  10. echo "$a - $b - $c" = $num2
  11. echo "$a * $b * $c" = $num3
  12. awk "BEGIN{printf \"$a/$b/$c=%.2f\n\",$a/$b/$c}"
  13. [root@slave02 ~]# source script01.sh 100 10 9
  14. 100 + 10 + 9 = 119
  15. 100 - 10 - 9 = 81
  16. 100 * 10 * 9 = 9000
  17. 100/10/9=1.11

2.猜数字游戏

规则:指定一个数字,只要猜到了这个数字则过关,否则显示数字大了或者数字小了

  1. [root@master ~]# cat test03.sh
  2. #!/bin/bash
  3. nums=99
  4. read -p "please enter a number: " num
  5. if [ $num -gt $nums ];then
  6. echo "数字大了"
  7. elif [ $num -lt $nums ];then
  8. echo "数字小了"
  9. else
  10. echo "猜对"
  11. fi
  12. [root@master ~]# . test03.sh
  13. please enter a number: 10
  14. 数字小了
  15. [root@master ~]# . test03.sh
  16. please enter a number: 100
  17. 数字大了
  18. [root@master ~]# . test03.sh
  19. please enter a number: 99
  20. 猜对

3.写一个脚本,让nginx服务设置开机自启

  1. #$0是nginx本身 $1是变量对应着下面的start|stop|restart|status
  2. [root@192 init.d]# pwd
  3. /etc/init.d
  4. [root@192 init.d]# cat nginx
  5. #!/bin/bash
  6. case $1 in
  7. 'start')
  8. /usr/local/nginx/sbin/nginx
  9. ;;
  10. 'stop')
  11. /usr/local/nginx/sbin/nginx -s stop
  12. ;;
  13. 'restart')
  14. /usr/local/nginx/sbin/nginx -s stop
  15. /usr/local/nginx/sbin/nginx
  16. ;;
  17. 'status')
  18. num=$(ps -ef |grep -v 'grep'|grep -c nginx:)
  19. if [ $num -eq 0 ];then
  20. echo "nginx is stoped"
  21. else
  22. echo "nginx is running"
  23. fi
  24. ;;
  25. *)
  26. echo "Usage: service $0 start|stop|restart|status"
  27. ;;
  28. esac
  29. #当判断有nginx进程数量则认为开启服务,否则认为服务开启失败

4.利用for循环,创建user序号1-100的用户

  1. #创建用户user1-100
  2. [root@master ~]# cat test05.sh
  3. #!/bin/bash
  4. for (( i=1;i<=100;i++));do
  5. useradd user$i
  6. id user$i &>/dev/null
  7. if [ $? -eq 0 ];then #只要判断用户成功,$?才会显示0,显示0则代表执行下一条命令,否则显示user以及存在
  8. echo "success"
  9. else
  10. echo "user is exis"
  11. fi
  12. done

5.利用while循环,计算1+2…100的值

  1. [root@slave02 ~]# cat which.sh
  2. #!/bin/bash
  3. s=0 #初始值0
  4. i=1 #判断的数值,最终到100停止
  5. while [ $i -le 100 ];do
  6. s=$[$s+$i]
  7. i=$[$i+1] #自增加数
  8. done
  9. echo $s
  10. [root@slave02 ~]# source which.sh
  11. 5050
  12. #随便输入一个数字进行计算的话,把100改为$1即可

6.apache简单的一个编译部署脚本

  1. 1.一般项目或者脚本,文件,放在相应的位置里,方便查找
  2. [root@slave02 tmp]# pwd
  3. /tmp
  4. [root@slave02 tmp]# ls
  5. apache
  6. [root@slave02 apache]# ls
  7. install_apache.sh soft
  8. [root@slave02 soft]# ls
  9. apr-1.7.0.tar.bz2 apr-util-1.6.1.tar.bz2 httpd-2.4.48.tar.bz2 httpd.service
  10. [root@slave02 apache]# cat install_apache.sh #!/bin/bash echo "欢迎使用此脚本" apachedir=/usr/local/apache if [ $UID -ne 0 ];then
  11. echo "伙计,请使用管理员身份运行"
  12. fi
  13. echo "正在安装依赖包..."
  14. yum -y install epel-release bzip2 "@Development Tools" &>/dev/null
  15. yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make &>/dev/null
  16. id apache &>/dev/null
  17. if [ $? -ne 0 ];then
  18. useradd -r -M -s /sbin/nologin apache
  19. fi
  20. cd /tmp/apache/soft/
  21. tar -xf apr-1.7.0.tar.bz2
  22. tar -xf apr-util-1.6.1.tar.bz2
  23. tar -xf httpd-2.4.48.tar.bz2
  24. sed -i '/ $RM "$cfgfile"/d' apr-1.7.0/configure
  25. echo "正在编译安装apr,请听听歌放松放松......."
  26. cd apr-1.7.0/
  27. [ ! -d /usr/local/apr ]
  28. if [ $? -eq 0 ];then
  29. ./configure --prefix=/usr/local/apr && make && make install &>/dev/null
  30. else
  31. echo "apr已经安装"
  32. fi
  33. cd ../apr-util-1.6.1/
  34. [ ! -d /usr/local/apr-util ]
  35. if [ $? -eq 0 ];then
  36. ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install &/dev/null
  37. else
  38. echo "apr-util已经安装"
  39. fi
  40. cd ../httpd-2.4.48/
  41. [ ! -d /usr/local/apache/ ]
  42. if [ $? -eq 0 ];then
  43. ./configure --prefix=$apachedir --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
  44. make && make install &>/dev/null
  45. else
  46. echo "httpd已经安装"
  47. fi
  48. cd
  49. #有影响的加判断,没影响的忽略
  50. echo "export PATH=$apachedir/bin:\$PATH" > /etc/profile.d/httpd.sh
  51. ln -s $apachedir/include/ /usr/include/apache &>/dev/null
  52. grep 'apache/man' /etc/man_db.conf &>/dev/null
  53.  
  54. if [ $? -eq 1 ];then
  55. sed -i "20aMANDATORY_MANPATH $apachedir/man" /etc/man_db.conf
  56. else
  57. echo "apache is help exists"
  58. fi
  59.  
  60. [ ! -f /usr/lib/systemd/system/httpd.service ]
  61. if [ $? -eq 0 ];then
  62. cp /clq/apache/soft/httpd.service /usr/lib/systemd/system/
  63. else
  64. echo "已经存在文件跳过"
  65. fi
  66. systemctl daemon-reload
  67. systemctl enable --now httpd
  68. num02=$(ps -ef |grep -v 'grep'|grep -c httpd)
  69. if [ $num02 -eq 0 ];then
  70. echo "httpd自启失败"
  71. else
  72. echo "httpd自启成功"
  73. fi
  74. echo "欢迎下次使用"
  75. [root@slave02 apache]# chmod +x install_apache.sh
  76. [root@slave02 apache]# source install_apache.sh
  77. [root@slave02 apache]# source install_apache.sh
  78. 欢迎使用此脚本
  79. 正在安装依赖包...
  80. 正在编译安装apr,请听听歌放松放松.......
  81. apr以及安装
  82. apr-util以及安装
  83. httpd已经安装
  84. apache is help exists
  85. 已经存在文件跳过
  86. httpd自启成功
  87. 欢迎下次使用
  88. [root@slave02 ~]# systemctl status httpd.service
  89. httpd.service - Start http
  90. Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  91. Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago
  92. Main PID: 834761 (httpd)
  93. Tasks: 7 (limit: 5782)
  94. Memory: 6.3M
  95. CGroup: /system.slice/httpd.service
  96. ├─834761 /usr/local/apache/bin/httpd -k start
  97. ├─835358 /usr/local/apache/bin/httpd -k start
  98. ├─835359 /usr/local/apache/bin/httpd -k start
  99. ├─835360 /usr/local/apache/bin/httpd -k start
  100. ├─835361 /usr/local/apache/bin/httpd -k start
  101. ├─835362 /usr/local/apache/bin/httpd -k start
  102. └─836063 /usr/local/apache/bin/httpd -k start
  103. [root@slave02 ~]# ss -antl
  104. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
  105. LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
  106. LISTEN 0 128 *:80 *:*
  107. LISTEN 0 128 [::]:22 [::]:*

以上就是入门shell脚本基础解析的详细内容,更多关于shell脚本的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号