请选择 进入手机版 | 继续访问电脑版

[linux shell] 入门shell脚本基础及原理

[复制链接]
查看45 | 回复8 | 2021-9-12 16:43:27 | 显示全部楼层 |阅读模式
目次

1.特殊 变量

  1. $#:查看变量参数的个数
  2. $0:查看脚本的名字
  3. $!:查看shell后台的pid
  4. $@:查看传递脚本所有参数的列表
  5. $*:查看所有参数的列表,单字符串形式显示
  6. $$:脚本本身进程的ID
  7. $?:上一条命令的结果,显示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. #case支持的通配符:
  16. * //任意长度任意字符
  17. ? //任意单个字符
  18. [] //指字范围内的任意单个字符
  19. 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 \
  44. --sysconfdir=/etc/httpd24 \
  45. --enable-so \
  46. --enable-ssl \
  47. --enable-cgi \
  48. --enable-rewrite \
  49. --with-zlib \
  50. --with-pcre \
  51. --with-apr=/usr/local/apr \
  52. --with-apr-util=/usr/local/apr-util/ \
  53. --enable-modules=most \
  54. --enable-mpms-shared=all \
  55. --with-mpm=prefork
  56. make && make install &>/dev/null
  57. else
  58. echo "httpd已经安装"
  59. fi
  60. cd
  61. #有影响的加判断,没影响的忽略
  62. echo "export PATH=$apachedir/bin:\$PATH" > /etc/profile.d/httpd.sh
  63. ln -s $apachedir/include/ /usr/include/apache &>/dev/null
  64. grep 'apache/man' /etc/man_db.conf &>/dev/null
  65. if [ $? -eq 1 ];then
  66. sed -i "20aMANDATORY_MANPATH $apachedir/man" /etc/man_db.conf
  67. else
  68. echo "apache is help exists"
  69. fi
  70. [ ! -f /usr/lib/systemd/system/httpd.service ]
  71. if [ $? -eq 0 ];then
  72. cp /clq/apache/soft/httpd.service /usr/lib/systemd/system/
  73. else
  74. echo "已经存在文件跳过"
  75. fi
  76. systemctl daemon-reload
  77. systemctl enable --now httpd
  78. num02=$(ps -ef |grep -v 'grep'|grep -c httpd)
  79. if [ $num02 -eq 0 ];then
  80. echo "httpd自启失败"
  81. else
  82. echo "httpd自启成功"
  83. fi
  84. echo "欢迎下次使用"
  85. [root@slave02 apache]# chmod +x install_apache.sh
  86. [root@slave02 apache]# source install_apache.sh
  87. [root@slave02 apache]# source install_apache.sh
  88. 欢迎使用此脚本
  89. 正在安装依赖包...
  90. 正在编译安装apr,请听听歌放松放松.......
  91. apr以及安装
  92. apr-util以及安装
  93. httpd已经安装
  94. apache is help exists
  95. 已经存在文件跳过
  96. httpd自启成功
  97. 欢迎下次使用
  98. [root@slave02 ~]# systemctl status httpd.service
  99. ● httpd.service - Start http
  100. Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  101. Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago
  102. Main PID: 834761 (httpd)
  103. Tasks: 7 (limit: 5782)
  104. Memory: 6.3M
  105. CGroup: /system.slice/httpd.service
  106. ├─834761 /usr/local/apache/bin/httpd -k start
  107. ├─835358 /usr/local/apache/bin/httpd -k start
  108. ├─835359 /usr/local/apache/bin/httpd -k start
  109. ├─835360 /usr/local/apache/bin/httpd -k start
  110. ├─835361 /usr/local/apache/bin/httpd -k start
  111. ├─835362 /usr/local/apache/bin/httpd -k start
  112. └─836063 /usr/local/apache/bin/httpd -k start
  113. [root@slave02 ~]# ss -antl
  114. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
  115. LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
  116. LISTEN 0 128 *:80 *:*
  117. LISTEN 0 128 [::]:22 [::]:*
复制代码

以上就是入门shell脚本基础剖析 的具体 内容,更多关于shell脚本的资料请关注脚本之家别的 相干 文章!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar Abby_guguk | 2021-9-14 21:39:28 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar 韭菜555 | 2021-9-19 02:49:53 | 显示全部楼层
投admin楼主一票,不用谢哦!
回复

使用道具 举报

avatar 祖国统一富强 | 2021-9-20 07:49:56 | 显示全部楼层
不错的帖子,值得收藏!
回复

使用道具 举报

avatar 木子李皓 | 2021-9-26 19:51:02 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 简单350 | 2021-9-27 09:08:56 | 显示全部楼层
大神就是大神,这么经典!
回复

使用道具 举报

avatar 哪吒2017 | 2021-10-6 17:36:13 | 显示全部楼层
论坛人气好旺!
回复

使用道具 举报

admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

admin楼主的文笔不错!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则