SHELL

练习题网站

执行脚本方式

  1. +x权限
  2. bash
  3. source

source不开启子进程,其他两种会开启子进程

bash和source无需x权限

重定向输出信息

  1. 重定向正确输出 > /dev/null
  2. 重定向错误输出 2> /dev/null
  3. 重定向所有输出 &> /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

加减乘除、取模(取余数)

  1. 使用expr工具

例子:

expr 1 + 1

expr 2 - 1

expr 1 '*' 1 或 expr 1 \* 1

expr 1 / 1

expr 2 % 1
  1. echo $[1+1] 或echo $((1+1))

  2. 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--
  3. 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分支

  1. 单分支

    例子:

    #!/bin/bash
    if [ $UID -ne 0 ];then
    echo "你不是管理员"
    fi
    
  2. 双分支

    例子:

    #!/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
    
  3. 多分支

    例子:

    #!/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台"
上一篇:【阿里云镜像】配置阿里巴巴开源镜像站镜像——Epel镜像


下一篇:搭建yum私有仓库