0%

shell学习笔记-I

设置shell打印内容颜色

设置颜色 前景色31-36,后景色41-46

1
echo -e "\e[1;31mThis is a red text.\e[0m"

恢复颜色

1
echo -e "\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