设置shell打印内容颜色 设置颜色 前景色31-36,后景色41-46
1 echo -e "\e[1;31mThis is a red text.\e[0m"
恢复颜色
使用调试模式运行脚本 bash -vx test.sh
Ping 测试 ping -c1 192.168.6.131 && echo "192.168.6.131 is up" || echo "192.168.6.131 is down"
ping -c1 192.168.6.131 &> /dev/null && echo "192.168.6.131 is up" || echo "192.168.6.131 is down"
示例1 1 2 3 #!/bin/bash ip=192.168.6.151 ping -c1 $ip &> /dev/null && echo -e "\e[1;32m$ip is up\e[0m" || echo -e "\e[1;31m$ip is down\e[0m"
示例2 1 2 3 4 5 6 7 8 #!/usr/bin/bash ip=192.168.6.144 ping -c1 $ip &> /dev/null if [ $? -eq 0 ];then echo "$ip is up" else echo "$ip is down" fi
示例3 交互式输入
1 2 3 4 5 6 7 8 #!/usr/bin/bash read -p "Please input ip address: " ip ping -c1 $ip &> /dev/null if [ $? -eq 0 ];then echo "$ip is up" else echo "$ip is down" fi
示例4 使用位置变量
1 2 3 4 5 6 7 #!/usr/bin/bash ping -c1 $1 &> /dev/null if [ $? -eq 0 ];then echo "$1 is up" else echo "$1 is down" fi
示例5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash #如果用户没加参数,提示并退出 if [ $# -eq 0 ];then echo "usage: `basename $0` file" exit fi #判断第一个参数是否为文件 if [ ! -f $1 ];then echo "error file!" exit fi #判断ip地址是否能ping通并提示 for ip in `cat $1` do ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip is up." else echo "$ip is down." fi done
示例6 使用i++
1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash ip=192.168.6.131 i=1 while [ $i -le 5 ] do ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip is up..." fi let i++ done
变量的赋值方式 显式赋值 示例
1 2 3 4 ip1=192.168.1.251 school="BeiJing 1000phone" today1=`date +%F` today2=$(date +%F)
read 从键盘读入变量值 1 2 3 4 5 6 7 8 -p 提示信息 -t 等待时间 -n 字符个数 read 变量名 read -p "提示信息:"变量名 read -t 5 -p "提示信息:" 变量名 read -n 2 变量名
1 2 read -p "请输入姓名,性别,年龄[e.g. zhangsan m 34]: " name sex age echo "您输入的姓名: $name,性别: $sex,年龄: $age"
1 2 3 " " 弱引用 ' ' 强引用 ` ` 命令替换 等价于$() 反引号中的shell命令会被优先执行
1 2 3 name="james" boy="$name is good.";echo $boy boy='$name is good.';echo $boy
变量的运算 整数运算 方法一:expr 1 2 expr $num1 + $num2 + - \* / % expr 1 + 2
方法二:$(()) 1 2 echo $(($num1+$num2)) + - \* / % echo $((1+2))
方法三:$[] 1 2 echo $[$num1+$num2] + - \* / % echo $[5*2]
方法四:let 1 2 let sum=2+3;echo $sum let i++;echo $i
1 2 3 4 i=1 j=1 let x=i++ 先赋值,再运算 let y=++j 先运算,再赋值
示例:查看当前内存使用率
1 2 3 4 5 #!/bin/bash mem_used=`free -m |grep '^Mem'|awk '{ print $3}'` mem_total=`free -m |grep '^Mem'|awk '{ print $2}'` mem_percent=$((mem_used*100/mem_total)) echo "当前内存使用率为:" $mem_percent
使用调试模式运行脚本 bash -vx mem_usage.sh
小数运算 1 2 3 echo "scale=2;6/4" |bc awk 'BEGIN{print 1/3}'
变量“内容”的删除和替换 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 [root@sx3_app2 script]# url=www.islocal.cc 打印变量 [root@sx3_app2 script]# echo ${url} www.islocal.cc 打印变量长度 [root@sx3_app2 script]# echo ${#url} 14 从前往后删除,删到第一个. [root@sx3_app2 script]# echo ${url#*.} islocal.cc 从前往后删除,删到最后一个. [root@sx3_app2 script]# echo ${url##*.} cc 从后往前删除,删到第一个. [root@sx3_app2 script]# echo ${url%.*} www.islocal 从后往前删除,删到最后一个. [root@sx3_app2 script]# echo ${url%%.*} www 索引及切片 索引切片从0开始 [root@sx3_app2 script]# echo ${url:4} islocal.cc [root@sx3_app2 script]# echo ${url:4:7} islocal 替换 [root@sx3_app2 script]# echo ${url/cc/com} www.islocal.com ${变量名-新的变量值} 变量没有被赋值:会使用“新的变量值”替代 变量有被赋值(包括空值):不会被替代 [root@sx3_app2 script]# var1=111 [root@sx3_app2 script]# var2= [root@sx3_app2 script]# echo ${var1} 111 [root@sx3_app2 script]# echo ${var2} [root@sx3_app2 script]# echo ${var3} [root@sx3_app2 script]# echo ${var1-222} 111 [root@sx3_app2 script]# echo ${var2-222} [root@sx3_app2 script]# echo ${var3-222} 222 ${变量名:-新的变量值} 变量没有被赋值(包括空值):会使用“新的变量值”替代 变量有被赋值:不会被替代 [root@sx3_app2 script]# unset var1 [root@sx3_app2 script]# unset var2 [root@sx3_app2 script]# unset var3 [root@sx3_app2 script]# var1=aaa [root@sx3_app2 script]# var2= [root@sx3_app2 script]# echo ${var1} aaa [root@sx3_app2 script]# echo ${var2} [root@sx3_app2 script]# echo ${var3} [root@sx3_app2 script]# echo ${var1:-bbb} aaa [root@sx3_app2 script]# echo ${var2:-bbb} bbb [root@sx3_app2 script]# echo ${var3:-bbb} bbb
shell条件测试 man test 格式1:test 条件表达式test -d /home
格式2:[ 条件表达式 ][ -d /home ]
格式3:[[ 条件表达式 ]]
文件比较 1 2 3 4 5 6 7 8 9 [ -e file|dir ] 是否为文件/目录 [ -f file ] 是否存在,而且是文件 [ -d dir ] 是否为目录 [ -r file ] 当前用户是否有读取权限 [ -w file ] 当前用户是否有写入权限 [ -x file ] 当前用户是否有执行权限 [ -L file ] 是否为链接文件 [ -b file ] 是否为块设备 [ -c file ] 是否为字符
数值比较 1 2 3 4 5 6 -eq 等于(equal) -ne 不等于(not equal) -lt 小于(less than) -le 小于等于(less equal) -gt 大于(greater than) -ge 大于等于(greater equal)
字符串比较 两个字符串之间的比较,用等号“=”判断相等,用“!=”判断不等
NF 表示倒数 df -Th |grep '/$' |awk '{print $(NF-1)}'
特殊符号运用 1 2 3 4 5 6 7 8 9 10 11 () 子shell中执行 (()) 数值比较,运算C语言 $() 命令替换 和``一样 $(()) 整数运算 {} 集合 ${} 变量的引用、替换 [] 条件测试 [[]] 条件测试,支持正则=~ $[] 整数运算
创建用户脚本 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 #!/bin/bash ###################################### # Name: useradd01.sh # # Date: 2022/7/20 # # Author: Arlo # ###################################### read -p "Please input number: " num while true do #判断用户输入的是否为数字 if [[ $num =~ ^[0-9]+$ ]];then break else read -p "Please input number again: " num fi done read -p "please input prefix: " prefix while true do if [ -n "$prefix" ];then break else read -p "please input prefix again: " prefix fi done for i in `seq $num` do user=$prefix$i useradd $user echo "123" | passwd --stdin $user &>/dev/null if [ $? -eq 0 ];then echo "$user is created." fi done
学习链接:https://www.bilibili.com/video/BV19t411s7Jx