入门shell脚本基础及原理
弄懂shell程序,源代码,以及python脚本能够向运维开发方向走,shell程序能够管理集群,提高开发的效率,shell是命令解释器,调用系统内核,帮助你对内核的刷新认识
目录
1.特殊变量
2.内部环境变量
3.整数以及字符判断
3.1整数判断
3.2字符测试
4.文件判断
5.read输入
6.if判断
7.案例选择判断
8.for循环
9.while循环
10.深入练习
1.写一个脚本,输入三个数字进行相应的加减乘除
2.猜数字游戏
3.写一个脚本,让nginx服务设置开机自启
4.利用for循环,创建user序号1-100的用户
5.利用while循环,计算1+2…100的值
6.apache简单的一个编译部署脚本
1.特殊变量
$#:查看变量参数的个数
$0:查看脚本的名字
$!:查看shell后台的pid
$@:查看传递脚本所有参数的列表
$*:查看所有参数的列表,单字符串形式显示
$$:脚本本身进程的ID
$?:上一条命令的结果,显示0则成功,不是0则失败
2.内部环境变量
1 2 3 4 5 6 7 | $PATH SHELL 当前使用的shell UID 当前的用户环境 {0|其它数字}={root|其它用户} HOME 当前使用的用户目录 PWD 当前的目录 HISTFILE 历史命令路径 PS1 #[\u@\h \W]\$ 用户@主机名\目录\$ |
3.整数以及字符判断
3.1整数判断
1 2 3 4 5 6 | - eq 测试俩个整数是否相等 (equal) - ne 测试俩个整数是否不等 (unequal) -gt 测试一个数是否大于一个数 (greater than) -lt 测试一个数是否小于一个数 ( less than) - ge 测试一个数大于或等于 - le 测试一个数小于或等于 |
3.2字符测试
1 2 3 4 5 6 7 8 9 10 11 | =~ 测试是否被正则表达式匹配 -z "string" 检测字符是否为空,空则真,不空则假 如: [ -z "" ]为真空则为真 -n "string" 检测字符是否不空,不空则真,不空则假 字符相比较大小用[[ ]],比的是第一个字母(a-zA-Z)都是大写或者都是小写比较ascii值 越大则越大 有大写又有小写则A>a B>b 但是A不大于b的情况 [root@slave02 ~] # [[ "A" < "B" ]] [root@slave02 ~] # echo $? 0 [root@slave02 ~] # [[ "a" < "b" ]] [root@slave02 ~] # echo $? 0 |
4.文件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | -e:文件是否存在 -b:测试是否块设备文件 -c:测试是否字符设备文件 -f:测试是否普通文件 -d:测试是否目录 -h:测试是否符号链接文件 -L:测试是否是符号链接文件 -p:测试是否是命名管道文件 -S:测试是否是套接字文件 权限相关: -r 读 -w 写 -x 执行 特殊权限 -g -u -k 等 |
5.read输入
1 2 3 | 选项: -p:指定提示符 -t:指定提示等待的时间(秒) |
6.if判断
1 2 3 4 5 6 7 8 9 10 11 | 多分支: if [ 条件 ]; then statement1 ..... elif [ 条件2 ]; then statement2 .... else statement3 .... fi |
7.案例选择判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | case $变量名 in 'value1' ) statement ... ;; 'value2' ) statement ... ;; *) statement .. ;; esac #case支持的通配符: * // 任意长度任意字符 ? // 任意单个字符 [] // 指字范围内的任意单个字符 start|START // 俩种选择 |
8.for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 第一种: for ((expr1;expr2;expr3)) # expr1:初始值条件 #expr2:循环的范围进行退出 #expr3:变量的值使用 { 循环体 } for ((expr1;expr2;expr3)); do 循环体 done 第二种: for 变量 in 列表; do 循环体 done |
9.while循环
1 2 3 4 5 | while 循环用于不知道循环次数的场景,注意有退出条件 while [ 条件 ]; do statement ..... done |
10.深入练习
1.写一个脚本,输入三个数字进行相应的加减乘除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@slave02 ~] # cat script01.sh #!/bin/bash a=$1 b=$2 c=$3 num1=$[$a+$b+$c] num2=$[$a-$b-$c] num3=$[$a*$b*$c] echo "$a + $b + $c" = $num1 echo "$a - $b - $c" = $num2 echo "$a * $b * $c" = $num3 awk "BEGIN{printf \"$a/$b/$c=%.2f\n\",$a/$b/$c}" [root@slave02 ~] # source script01.sh 100 10 9 100 + 10 + 9 = 119 100 - 10 - 9 = 81 100 * 10 * 9 = 9000 100 /10/9 =1.11 |
2.猜数字游戏
规则:指定一个数字,只要猜到了这个数字则过关,否则显示数字大了或者数字小了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@master ~] # cat test03.sh #!/bin/bash nums=99 read -p "please enter a number: " num if [ $num -gt $nums ]; then echo "数字大了" elif [ $num -lt $nums ]; then echo "数字小了" else echo "猜对" fi [root@master ~] # . test03.sh please enter a number: 10 数字小了 [root@master ~] # . test03.sh please enter a number: 100 数字大了 [root@master ~] # . test03.sh please enter a number: 99 猜对 |
3.写一个脚本,让nginx服务设置开机自启
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #$0是nginx本身 $1是变量对应着下面的start|stop|restart|status [root@192 init.d] # pwd /etc/init .d [root@192 init.d] # cat nginx #!/bin/bash case $1 in 'start' ) /usr/local/nginx/sbin/nginx ;; 'stop' ) /usr/local/nginx/sbin/nginx -s stop ;; 'restart' ) /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx ;; 'status' ) num=$( ps -ef | grep - v 'grep' | grep -c nginx:) if [ $num - eq 0 ]; then echo "nginx is stoped" else echo "nginx is running" fi ;; *) echo "Usage: service $0 start|stop|restart|status" ;; esac #当判断有nginx进程数量则认为开启服务,否则认为服务开启失败 |
4.利用for循环,创建user序号1-100的用户
1 2 3 4 5 6 7 8 9 10 11 12 | #创建用户user1-100 [root@master ~] # cat test05.sh #!/bin/bash for (( i=1;i<=100;i++)); do useradd user$i id user$i &> /dev/null if [ $? - eq 0 ]; then #只要判断用户成功,$?才会显示0,显示0则代表执行下一条命令,否则显示user以及存在 echo "success" else echo "user is exis" fi done |
5.利用while循环,计算1+2…100的值
1 2 3 4 5 6 7 8 9 10 11 12 | [root@slave02 ~] # cat which.sh #!/bin/bash s=0 #初始值0 i=1 #判断的数值,最终到100停止 while [ $i - le 100 ]; do s=$[$s+$i] i=$[$i+1] #自增加数 done echo $s [root@slave02 ~] # source which.sh 5050 #随便输入一个数字进行计算的话,把100改为$1即可 |
6.apache简单的一个编译部署脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 1.一般项目或者脚本,文件,放在相应的位置里,方便查找 [root@slave02 tmp] # pwd /tmp [root@slave02 tmp] # ls apache [root@slave02 apache] # ls install_apache.sh soft [root@slave02 soft] # ls apr-1.7.0. tar .bz2 apr-util-1.6.1. tar .bz2 httpd-2.4.48. tar .bz2 httpd.service [root@slave02 apache] # cat install_apache.sh #!/bin/bash echo "欢迎使用此脚本" apachedir=/usr/local/apache if [ $UID -ne 0 ];then echo "伙计,请使用管理员身份运行" fi echo "正在安装依赖包..." yum -y install epel-release bzip2 "@Development Tools" &> /dev/null yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make &> /dev/null id apache &> /dev/null if [ $? - ne 0 ]; then useradd -r -M -s /sbin/nologin apache fi cd /tmp/apache/soft/ tar -xf apr-1.7.0. tar .bz2 tar -xf apr-util-1.6.1. tar .bz2 tar -xf httpd-2.4.48. tar .bz2 sed -i '/ $RM "$cfgfile"/d' apr-1.7.0 /configure echo "正在编译安装apr,请听听歌放松放松......." cd apr-1.7.0/ [ ! -d /usr/local/apr ] if [ $? - eq 0 ]; then . /configure --prefix= /usr/local/apr && make && make install &> /dev/null else echo "apr已经安装" fi cd .. /apr-util-1 .6.1/ [ ! -d /usr/local/apr-util ] if [ $? - eq 0 ]; then . /configure --prefix= /usr/local/apr-util --with-apr= /usr/local/apr && make && make install & /dev/null else echo "apr-util已经安装" fi cd .. /httpd-2 .4.48/ [ ! -d /usr/local/apache/ ] if [ $? - eq 0 ]; then . /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 make && make install &> /dev/null else echo "httpd已经安装" fi cd #有影响的加判断,没影响的忽略 echo "export PATH=$apachedir/bin:\$PATH" > /etc/profile .d /httpd .sh ln -s $apachedir /include/ /usr/include/apache &> /dev/null grep 'apache/man' /etc/man_db .conf &> /dev/null if [ $? - eq 1 ]; then sed -i "20aMANDATORY_MANPATH $apachedir/man" /etc/man_db .conf else echo "apache is help exists" fi [ ! -f /usr/lib/systemd/system/httpd .service ] if [ $? - eq 0 ]; then cp /clq/apache/soft/httpd .service /usr/lib/systemd/system/ else echo "已经存在文件跳过" fi systemctl daemon-reload systemctl enable --now httpd num02=$( ps -ef | grep - v 'grep' | grep -c httpd) if [ $num02 - eq 0 ]; then echo "httpd自启失败" else echo "httpd自启成功" fi echo "欢迎下次使用" [root@slave02 apache] # chmod +x install_apache.sh [root@slave02 apache] # source install_apache.sh [root@slave02 apache] # source install_apache.sh 欢迎使用此脚本 正在安装依赖包... 正在编译安装apr,请听听歌放松放松....... apr以及安装 apr-util以及安装 httpd已经安装 apache is help exists 已经存在文件跳过 httpd自启成功 欢迎下次使用 [root@slave02 ~] # systemctl status httpd.service ● httpd.service - Start http Loaded: loaded ( /usr/lib/systemd/system/httpd .service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago Main PID: 834761 (httpd) Tasks: 7 (limit: 5782) Memory: 6.3M CGroup: /system .slice /httpd .service ├─834761 /usr/local/apache/bin/httpd -k start ├─835358 /usr/local/apache/bin/httpd -k start ├─835359 /usr/local/apache/bin/httpd -k start ├─835360 /usr/local/apache/bin/httpd -k start ├─835361 /usr/local/apache/bin/httpd -k start ├─835362 /usr/local/apache/bin/httpd -k start └─836063 /usr/local/apache/bin/httpd -k start [root@slave02 ~] # ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 *:80 *:* LISTEN 0 128 [::]:22 [::]:* |
以上就是入门shell脚本基础解析的详细内容