执行脚本方式
- +x权限
- bash
- source
source不开启子进程,其他两种会开启子进程
bash和source无需x权限
重定向输出信息
- 重定向正确输出 > /dev/null
- 重定向错误输出 2> /dev/null
- 重定向所有输出 &> /dev/null
自定义变量
a=10
echo ${a}RMB //{}用于隔开变量与常量,避免混淆
export a=10 //发布为全局变量
export -n a //将全局变量恢复为局部变量
位置变量与预定义变量
$1 执行脚本时后面第1个位置参数
$2 执行脚本时后面第2个位置参数
$3 执行脚本时后面第3个位置参数
$* 执行脚本时后面所有位置参数
$# 执行脚本时后面位置参数的个数
$$ 随机进程号
$? 判断上一条指令是否执行成功,0是成功,非0是失败
例子
创建用户
vim useradd.sh
#!/bin/bash
read -p "请输入用户名:" username
stty -echo
read -p "请输入密码:" passwd
stty echo
useradd $username
echo "$passwd" | passwd --stdin $username
屏蔽回显 stty -echo
恢复回显 stty echo
加减乘除、取模(取余数)
- 使用expr工具
例子:
expr 1 + 1
expr 2 - 1
expr 1 '*' 1 或 expr 1 \* 1
expr 1 / 1
expr 2 % 1
-
echo $[1+1] 或echo $((1+1))
-
let 运算后无任何输出
- let c=$a+$b
- echo $c
- let a=a+2 或 let a+=2
- let a-=2
- let a*=2
- let a/=2
- let a%=2
对变量自增减
- let a++
- let a--
-
bc(支持小数运算)
- echo "1.1+2.2" | bc
- echo "scale=3;10/3" | bc //scale表示计算结果保留几位小数
- echo "1+1;2+2" //分号隔开,同时多个运算
条件测试
test a == a 或 [ a == a ]
echo $?
a=abc
b=xyz
[ $a == $b ] //使用变量判断两个变量的值是否相等
[ $a != $b ] //使用变量判断两个变量的值是否不相等
[ "$c" == $b ] //如果变量为空,有可能报错,加双引号可以避免
-z判断变量是否为空
[ -z $a ] //判断变量是否为空
echo $?
[ ! -z $a ] //判断变量是否非空
逻辑组合
&& //条件成功才执行后续指令
|| //条件失败才执行后续指令
当多个逻辑符号组合使用时
A && B //A、B任务都成功算成功
A || B //A、B任务有一个成功算成功
数字
-eq //是否相等
-ne //是否不等
-gt //是否大于
-ge //是否大于等于
-lt //是否小于
-le //是否小于等于
例子:
#!/bin/bash
x=`cat /etc/passwd | wc -l`
[ $x -gt 10 ]
echo "123"
文件
-e //判断文件是否存在,不关心类型
-f //判断文件是否存在
-d //判断目录是否存在
-r //判断当前用户对文件是否有读权限
-w //判断当前用户对文件是否有写权限
-x //判断当前用户对文件是否有执行权限
例子:
[ -d abc ] || mkdir abc //判断是否存在abc目录,如果失败就创建abc
if分支
-
单分支
例子:
#!/bin/bash if [ $UID -ne 0 ];then echo "你不是管理员" fi
-
双分支
例子:
#!/bin/bash if [ $UID -ne 0 ];then echo "你不是管理员" else echo "你是管理员" fi
判断一个地址通不通:
#! /bin/bash ping -c 3 -i 0.2 -W 1 192.168.2.5 &> /dev/null #-c指定ping次数,-i指定每次ping的时间,-W表示当ping不通时多久返回结果 if [ $? -eq 0 ];then echo "通了!" else echo "不通!" fi
-
多分支
例子:
#!/bin/bash read -p "猜数字游戏,请猜一个数字:" x if [ $x -eq 5 ];then echo "猜对了!" elif [ $x -gt 5 ];then echo "猜大了!" else echo "猜小了" fi
循环
for循环
例子:
#!/bin/bash
for i in {1..10}
do
echo $i
done
例子2:
#!/bin/bash
#ping测试,如果通x+1,不通则y+1
x=0
y=0
for i in {1..100}
do
ping -c 1 -i 0.2 -W 1 192.168.1.$i &> /dev/null
if [ $? -eq 0 ];then
echo "1.$i通了!"
let x++
else
echo "1.$i不通!"
let y++
fi
done
echo "通了$x台,不通$y台"