Shell脚本
变量
name="zhangsan"
for file in 'ls /etc'
或
for file in $(ls /etc)
#变量的调用
echo $name
echo ${name}
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
#只读变量 /bin/sh: NAME: This variable is read only,也不能删除
url="https://www.google.com"
readonly url
url="https://www.runoob.com"
#删除变量
unset name
字符串
- 字符串时shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
- 单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字符串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用。
- 双引号
- 双引号里可以出现转义字符
- 双引号里可以有变量
#字符串拼接--双引号
name='sunwukong'
name1="hello, "$name" !"
name2="hello, ${name} !"
#字符串拼接--单引号
passwd='123456'
passwd1='hello,'$passwd' !'
passwd2='hello, ${passwd} !'
echo $passwd2 # hello,${passwd} !
#字符串长度
email="123456@qq.com"
echo ${#email}
#从第几个开始往后数几个
echo ${email:1:4}
数组
-
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
-
数组元素的下标由0开始编号。获取数组中的数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.
-
#定义数组 括号来表示数组,数组元素用"空格"符号分割开 favs=("足球" “篮球” “乒乓球” “保龄球”) #读取数组 fav=${favs[1]} echo $facv #使用@符号可以获取数组中的所有元素 echo ${favs[@]} #获取数组的长度 length1=${#favs[@]} length2=${#favs[*]}
注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<!
注释内容...
注释内容...
注释内容...
!
运算符
- 关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回ture | [$a -eq $b]返回false |
-ne | 检测两个数是否不相等,不相等返回true | [$a -ne $b]true |
-gt | 检测左边的数是否大于右边的,如果是,则返回true | [$a -gt $b]返回false |
-lt | 检测左边的数是否小于右边的,如果是,则返回true | [$a -lt $b]返回true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回true | [$a -ge $b] 返回false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回true | [$a -le $b] 返回true |
#!/bin/bash
a=10
b=20
//if这里一定要有空格
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
- 布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算 | [!false]返回ture |
-o | 或运算,有一个表达式为true则返回true | [$a -lt 20 -o $b -gt 100]则返回true |
-a | 与运算,有false则返回false | [$a -lt 20 -o $b -gt 100]则返回true |
- 文件测试运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回true | [$a = $b] 返回false |
!= | 不相等 | / |
-z | 检测字符串长度是否为0,为0则返回true | [-z $a] 返回false |
-n | 检测字符串长度是否不为0 | [-n “$a”]返回true |
$ | 检测字符串是否为空,不为空返回true | [$a] 返回true |
- 算数运算符
- expr是一款表达式计算工具,使用它能完成表达式的求值操作。
a=10 b=20
echo `expr $a + $b`
//echo `expr $[a+b]`
30
- 文件测试运算符
#!/bin/bash
if [ -r $1 ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $1 ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $1 ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $1 ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $1 ]
then
echo "文件是个目录"
else
echo "文件不是目录"
fi
if [ -s $1 ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $1 ]
then
echo "文件存在"
else
echo "文件不存在"
fi
执行脚本输入传参
1)$+数字
#!/bin/bash
# 传递参数
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
2)read(监控键盘的一个输入)
echo 'please input a sb name'
read username
echo $username
echo打印数据
##显示普通字符串
echo "Hello world"
##显示转义字符
echo "\"Hello world\""
##显示换行
echo -e "OK! \n"
##显示不换行
echo -e "OK! \c"
##显示显示结果定向至文件,结果会创建一个文件然后有一行Hello world
##>表示输出,会覆盖文件原有的内容
##>>表示追加,会将内容追加到已有的文件的末尾。
echo "Hello world" > myfile
##原样输出字符串
echo '$name\"'
##显示命令执行效果
echo `date`
流程控制
if condition1
then//符合条件就是then
command1
elif condition2
then
command2
else
commandN
fi
case
echo '输入1到4之间的数字:'
echo '你输入的数字为:'
read num
//;;相当于break,*)相当于default
case $num in
1) echo '你选择了1'
;;
2) echo '你选择了2'
;;
3) echo '你选择了3'
;;
4) echo '你选择了4'
;;
*) echo '你没有输入1-4之间的数字'
;;
esac
函数
-
linux shell可以用户定义的数,然后在shell脚本中可以随便用。
-
可以带function fun()定义,也可以直接fun()定义,不带任何参数。
-
参数返回,可以加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)。
-
#! /bin/bash ## 第一个函数----------------------- demoFun(){ echo "这是我的第一个shell 函数" } echo "-------函数开始执行------" demoFun echo "-------函数执行完毕------" ##函数返回值------------------------------- funwithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字:" read aNum echo "输入第二个数字:" read anotherNum echo } num=funwithReturn #函数返回值在调用该函数后通过$?来获得。 echo "输入的两个数字之和为$?!" ##函数参数--------------- funwithParam(){ echo "第一个参数为 $1 " echo "第二个参数为 $2 " echo "第十个参数为 $10 " echo "第十个参数为 ${10} " echo "第十一个参数为 ${11} " echo "参数总共有 $# 个!" echo "作为一个字符串输出所有参数 $* !" }
eval
在脚本中,eval 是一个用于执行动态生成的字符串作为代码的函数。它的作用是将字符串参数作为有效的表达式、命令或脚本进行求值和执行。
#执行赋值0给flag1
eval "$flag$1=0"
#获取echo $flag1的结果并和0进行比较
if [ "$(eval echo \$$flag$1)" -eq 0 ]; then
udhcpc
udhcpc
是一个用户空间的 DHCP 客户端工具。DHCP(Dynamic Host Configuration Protocol)是一种网络协议,用于自动地分配 IP 地址、子网掩码、默认网关以及其他与网络连接相关的参数。
#-i eth0 指定要使用 eth0 网络接口进行 DHCP 请求。
udhcpc -i eth0
local
用于声明局部变量
local interface="eth$1"
ip link
ip link
是一个用于管理网络接口的命令行工具。它通常用于配置和管理 Linux 操作系统中的网络接口,如以太网接口(Ethernet)、无线接口(Wi-Fi)和虚拟接口(例如 VLAN、Tunnel 等)。
#列出当前系统上的所有网络接口,并提供与这些接口相关的信息,例如接口名称、MAC 地址、状态(UP/ DOWN)、接口类型、MTU 大小
ip link
#列出所有网络接口及其详细信息
ip link show
#启用或禁用一个网络接口
ip link set <interface> up # 启用接口
ip link set <interface> down # 禁用接口
#设置网络接口的 MAC 地址
ip link set <interface> address <mac_address>
#设置网络接口的 MTU 大小
ip link set <interface> mtu <mtu_size>
ip route
#列出所有路由表项及其详细信息
ip route show
#列出特定网络的路由表项
ip route show <network_address>
#添加一条新的路由表项
ip route add <network_address>/<subnet_mask> via <gateway> dev <interface>
#删除一条路由表项
ip route del <network_address>/<subnet_mask> via <gateway> dev <interface>
#删除默认路由
ip route del default >/dev/null 2>&1
#删除eth0的所有路由
ip route flush dev eth0
#添加eth1为默认路由
ip route add default via 192.168.1.1 dev eth1