目录
shell编程基础:
shell脚本的本质:shell命令的有序集合。
shell脚本的特点:减轻管理员的工作量,提高处理文本文件的速度
注:shell脚本是解释型的语言,所以不用编译直接执行
另外,后缀是给人做区分的,linux系统不以后缀区分文件
cat /etc/shells 查看系统支持哪些解释器
root@ubuntu:/Liunx/shell# cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /bin/dash /usr/bin/dash
echo $SHELL 查看系统默认的解释器
root@ubuntu:/Liunx/shell# echo $SHELL /bin/bash
shell编程的基本过程:
1.建立shell文件
vi(vim) 文件名
2.执行shell文件的两种方式
Ⅰ、①先赋予shell文件执行的权限
用chmod命令修改权限
chmod 0777 文件名
② ./文件名
root@ubuntu:/Liunx/shell# vim demo1.sh root@ubuntu:/Liunx/shell# ./demo1.sh bash: ./demo1.sh: Permission denied root@ubuntu:/Liunx/shell# chmod 0777 demo1.sh root@ubuntu:/Liunx/shell# ll total 12 drwxr-xr-x 2 root root 4096 4月 15 22:16 ./ drwxr-xr-x 4 root root 4096 4月 15 22:05 ../ -rwxrwxrwx 1 root root 18 4月 15 22:16 demo1.sh* root@ubuntu:/Liunx/shell# ./demo1.sh total 4 -rwxrwxrwx 1 root root 18 4月 15 22:16 demo1.sh root@ubuntu:/Liunx/shell# cat demo1.sh #!/bin/bash ls -l
执行文件的第二种方式:
直接 bash demo1.sh 这样执行不用修改脚本文件的权限
root@ubuntu:/Liunx/shell# vim demo2.sh root@ubuntu:/Liunx/shell# cat demo2.sh #! /bin/bash pwd root@ubuntu:/Liunx/shell# ll total 16 drwxr-xr-x 2 root root 4096 4月 15 22:19 ./ drwxr-xr-x 4 root root 4096 4月 15 22:05 ../ -rwxrwxrwx 1 root root 18 4月 15 22:16 demo1.sh* -rw-r--r-- 1 root root 17 4月 15 22:19 demo2.sh root@ubuntu:/Liunx/shell# bash demo2.sh /Liunx/shell
shell变量:
1.变量在使用的时候,不需要定义
2.变量在赋值的时候前后不能有空格。
1 #! /etc/bash 2 num=1 3 num1 = 2 ~ root@ubuntu:/Liunx/shell# bash demo3.sh demo3.sh: line 3: num1: command not found
3.变量在被赋值的时候默认都是字符串,不管有没有使用。
变量的分类:
1.用户自定义的变量。
在使用变量的时候需要加$.
#!/bin/bash num=1 echo $num
root@ubuntu:/Liunx/shell# vim demo3.sh root@ubuntu:/Liunx/shell# bash demo3.sh 1 root@ubuntu:/Liunx/shell# cat demo3.sh #! /etc/bash num=1 echo $num
2.位置变量,
即命令行参数
$0:脚本的文件名
$1-$9:第一个到第9个命令行参数,超过9的用{}表示,${10},以此类推,注意,如果有$1-$9没用,但是用了${10},那么${10}不会显示,其所代表的参数也不会显示,并且参数只能依次递增,不能没有${10},却有${11},否则不打印
root@ubuntu:/Liunx/shell# bash demo3.sh 1 3 5 7 9 2 4 6 8 demo3.sh 1 3 5 7 9 2 4 6 9 1 3 5 7 9 2 4 6 8 0 1 3 5 7 9 2 4 6 8 49019 <pre>root@ubuntu:/Liunx/shell# cat -n demo3.sh 1 #! /etc/bash 2 echo $0 3 echo $1 4 echo $2 5 echo $3 6 echo $4 7 echo $5 8 echo $6 9 echo $7 10 echo $8 11 echo ${10} 12 echo $# 13 echo $@ 14 echo $? 15 echo $* 16 echo $$ </pre> root@ubuntu:/Liunx/shell# bash demo3.sh 1 3 5 7 9 2 4 6 8 0 demo3.sh 1 3 5 7 9 2 4 6 8 0 10 1 3 5 7 9 2 4 6 8 0 0 1 3 5 7 9 2 4 6 8 0 49024 root@ubuntu:/Liunx/shell# cat -n demo3.sh 1 #! /etc/bash 2 echo $0 3 echo $1 4 echo $2 5 echo $3 6 echo $4 7 echo $5 8 echo $6 9 echo $7 10 echo $8 11 echo $9 12 echo ${10} 13 echo $# 14 echo $@ 15 echo $? 16 echo $* 17 echo $$ root@ubuntu:/Liunx/shell# bash demo3.sh 1 3 5 7 9 2 4 6 8 0 demo3.sh 1 3 5 7 9 2 4 6 8 10 1 3 5 7 9 2 4 6 8 0 0 1 3 5 7 9 2 4 6 8 0 49038 root@ubuntu:/Liunx/shell# cat -n demo3.sh 1 #! /etc/bash 2 echo $0 3 echo $1 4 echo $2 5 echo $3 6 echo $4 7 echo $5 8 echo $6 9 echo $7 10 echo $8 11 echo $9 12 echo ${11} 13 echo $# 14 echo $@ 15 echo $? 16 echo $* 17 echo $$
$#:表示命令行参数的个数
$@:表示所有的命令行参数
$*:表示所有的命令行参数
root@ubuntu:/Liunx/shell# vim demo3.sh root@ubuntu:/Liunx/shell# cat demo3.sh #! /etc/bash echo $0 echo $1 echo $2 echo $# echo $@ echo $* root@ubuntu:/Liunx/shell# bash demo3.sh 1 3 demo3.sh 1 3 2 1 3 1 3
3.预定义变量
$?:前一个命令退出的状态
//如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误
root@ubuntu:/Liunx/shell# echo $? 0 root@ubuntu:/Liunx/shell# ls demo1.sh demo2.sh demo3.sh demo4.sh demo5.sh root@ubuntu:/Liunx/shell# ls demo6.sh ls: cannot access 'demo6.sh': No such file or directory root@ubuntu:/Liunx/shell# echo $? 2
$$:包含正在执行进程的 ID 号
root@ubuntu:/Liunx/shell# la | echo $$ 39783 root@ubuntu:/Liunx/shell# ps | la demo1.sh demo2.sh demo3.sh demo4.sh demo5.sh root@ubuntu:/Liunx/shell# ps PID TTY TIME CMD 39782 pts/0 00:00:00 su 39783 pts/0 00:00:01 bash 49099 pts/0 00:00:00 ps root@ubuntu:/Liunx/shell# echo $$ 39783 root@ubuntu:/Liunx/shell# la demo1.sh demo2.sh demo3.sh demo4.sh demo5.sh 或者在用户自定义变量的 echo $$ 的使用
$!:后台运行的最后一个进程的进程号(PID)
4.环境变量
HOME:/etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator,默认为空格,tab及换行符
root@ubuntu:/Liunx/shell# echo $HOME /root
PATH:shell搜索路径
root@ubuntu:/Liunx/shell# bash demo5.sh /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/...9.33.2/bin root@ubuntu:/Liunx/shell# cat demo5.sh #!/bin/bash sum=$PATH
PS1,PS2:默认提示符($)及换行提示符(>)
root@ubuntu:/Liunx/shell# echo $PS1 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ root@ubuntu:/Liunx/shell# echo $PS2 >
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
root@ubuntu:/Liunx/shell# echo $TERM xterm-256color
注:环境变量可以用env查看
root@ubuntu:/Liunx/shell# env SHELL=/bin/bash SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/2163,unix/ubuntu:/tmp/.ICE-unix/2163 QT_ACCESSIBILITY=1 ..................... OLDPWD=/Liunx _=/usr/bin/env
例:定义两个变量sum,sum1,第一个变量求path的路径,第二个变量求home的路径,最后交换两个变量所求的路径:
root@ubuntu:/Liunx/shell# cat -n demo6.sh 1 #!/bin/bash 2 sum=$PATH 3 sum1=$HOME 4 echo $sum 5 echo $? 6 echo $sum1 7 echo $? 8 sum2=0 9 sum2=$sum 10 sum=$sum1 11 sum1=$sum2 12 echo $sum 13 echo $? 14 echo $sum1 root@ubuntu:/Liunx/shell# bash demo6.sh /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin: 。。。 -0.9.33.2/bin 0 /root 0 /root 0 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin: 。。。 -0.9.33.2/bin
======================================================================
字符串的相关操作:
1.字符串的拼接
root@ubuntu:/Liunx/shell# bash demo7.sh hello world root@ubuntu:/Liunx/shell# cat -n demo7.sh 1 #!/bin/bash 2 str="hello" 3 str1="world" 4 str2="$str $str1" 5 echo $str2
2.字符串的拷贝
root@ubuntu:/Liunx/shell# vim demo8.sh root@ubuntu:/Liunx/shell# bash demo8.sh welcome welcome root@ubuntu:/Liunx/shell# cat -n demo8.sh 1 #!/bin/bash 2 str="welcome" 3 str1=$str 4 echo $str 5 echo $str1
3.字符串的长度
root@ubuntu:/Liunx/shell# vim demo8.sh root@ubuntu:/Liunx/shell# bash demo8.sh welcome welcome 7 root@ubuntu:/Liunx/shell# cat -n demo8.sh 1 #!/bin/bash 2 str="welcome" 3 str1=$str 4 echo $str 5 echo $str1 6 echo ${#str}
4.提取字符串
eg:str="www.baidu.com "
①:${str:start:len} 表示从start开始提取len长度的字符串
②:${str:start} 表示从start开始提取到末尾
③:${str:0-start:len} 表示从右侧开始向左侧找到start的位置,向后提取len长度的字符
④:${str:0-start} 表示从右侧开始向左侧找到start的位置,向后提取到末尾
上文的 start是代表在位置,阿拉伯数字,第1位,第2位...
⑤:${str#*start} 表示从左侧找到第一次出现start的位置,将start后面的字符串显示出来
⑥:${str##*start} 表示从左侧找到最后一次出现start的位置,将start后面的字符串显示出来
⑦:${str%start*} 表示从右侧向左侧搜索第一次出现start的位置,将字符串左侧的内容输出
⑧:${str%%start*} 表示从右侧向左侧搜索最后一次出现start的位置,将字符串左侧的内容输出
上文的 start 是代表着字符 a-z,A-Z
root@ubuntu:/Liunx/shell# bash demo4.sh www.baidu.com 0 aidu.com aid com 0 baidu.com 49350 ww.baidu.com .baidu.com 0 www.ii 0 www. root@ubuntu:/Liunx/shell# cat -n demo4.sh 1 #!/bin/bash 2 str="www.baidu.com" 3 str1="www.iii.cn" 4 echo $str 5 echo $# 6 echo ${str:5} 7 echo $@ 8 echo ${str:5:3} 9 echo $* 10 echo ${str:0-3:3} 11 echo $? 12 echo ${str:0-9} 13 echo $$ 14 echo ${str#*w} 15 echo $! 16 echo ${str##*w} 17 echo $? 18 echo ${str1%i*} 19 echo $? 20 echo ${str1%%i*}
=======================================================================
shell数组:
①在shell中只支持一维数组,不支持多维数组,数组中成员都是字符串
②shell中定义数组不需要指定元素的个数。
数组的操作:
整体赋值及数组成员变量的访问:arr=(1 3 5 7 hell wrold)
${arr[*]} 或者${arr[@]} 表示访问数组的所有元素
${arr[下标]} 表示访问数组的某个元素
获取某个数组成员的长度:
${#arr[4]} 表示获取下标为4的成员的长度
${#arr[*]} 或者${#arr[@]} 表示获取整个数组已经被赋值的成员的个数
root@ubuntu:/Liunx/shell/shuzu# bash demo1.sh 1 3 5 7 hello world 0 1 3 5 7 hello world 0 5 1 6 6 root@ubuntu:/Liunx/shell/shuzu# cat demo1.sh #!/bin/bash arr=(1 3 5 7 hello world) echo ${arr[*]} echo $? echo ${arr[@]} echo $? #访问数组的某个元素 echo ${arr[2]} #获取下标为4的成员的长度 echo ${#arr[2]} #获取整个数组已经被赋值的成员的个数 echo ${#arr[*]} echo ${#arr[@]}
清除数组元素:unset arr[下标]
root@ubuntu:/Liunx/shell/shuzu# bash demo1.sh 1 3 5 7 hello world 1 3 5 7 world root@ubuntu:/Liunx/shell/shuzu# cat demo1.sh #!/bin/bash arr=(1 3 5 7 hello world) echo ${arr[@]} unset arr[4] echo ${arr[*]}
=========================================================================
shell功能语句:
1.说明性语句
#:表示注释一行代码
:<<EOF EOF 表示范围注释
:<<!! !! 表示范围注释
root@ubuntu:/Liunx/shell/shuzu# bash demo1.sh 1 6 6 root@ubuntu:/Liunx/shell/shuzu# cat demo1.sh #!/bin/bash arr=(1 3 5 7 hello world) :<<EOF echo ${arr[@]} unset arr[4] EOF :<<!! echo ${arr[*]} #访问数组的某个元素 echo ${arr[2]} !! #获取下标为4的成员的长度 echo ${#arr[2]} #获取整个数组已经被赋值的成员的个数 echo ${#arr[*]} echo ${#arr[@]}
2.功能性的语句
①echo 注:echo语句自带换行功能
echo -n 表示不换行
echo -e 表示转义
root@ubuntu:/Liunx/shell/shuzu# bash demo2.sh hello world I love you hello worldI love you very\ngood very good root@ubuntu:/Liunx/shell/shuzu# cat demo2.sh #!/bin/bash str="hello world" str1="I love you" echo $str echo $str1 #不换行 echo -n $str echo $str1 #转义 echo "very\ngood" echo -e "very\ngood"
②read
read 变量名:表示从标准输入读入一行,并且赋值给后面的变量
read -s 变量名:表示隐形输入,不显示输入的值
read -t time 变量名:表示在规定时间内输入,如果没有输入自动结束
read -n num 变量名:表示输入num个字符后自动结束输入
read -p "提示信息" 变量名 :表示起提示作用
read -a 数组名:表示从终端上输入数组
root@ubuntu:/Liunx/shell/shuzu# cat demo3.sh #!/bin/bash echo "请输入指令" read var echo $var echo "请输入隐形指令" read -s var1 echo "请在规定时间内输入,如果没有输入自动结束" read -t 3 var2 echo $var2 echo "请在规定时间内输入,如果没有输入自动结束" read -t 3 var3 echo $var3 echo "请输入3个字符,3个字符后自动结束输入" read -n 3 var4 echo $var4 read -p "请输入数组:" -a sz #这样输入默认只输出首个数组元素 echo $sz echo "=======" echo ${sz[*]} echo "=======" echo ${sz[2]} root@ubuntu:/Liunx/shell/shuzu# bash demo3.sh 请输入指令 input input 请输入隐形指令 请在规定时间内输入,如果没有输入自动结束 w w 请在规定时间内输入,如果没有输入自动结束 请输入3个字符,3个字符后自动结束输入 llslls 请输入数组:i 2 4 12 34 i ======= i 2 4 12 34 ======= 4
③test:测试
(1).字符串测试
s1 = s2 测试两个字符串的内容是否完全一样 如果两个字符串相等返回0,不相等返回1
s1 != s2 测试两个字符串的内容是否有差异 如果两个字符串不相等返回0,相等返回1
-z s1 测试s1字符串的长度是否为0 如果长度为0就返回0,不为0则返回1
root@ubuntu:/Liunx/shell/shuzu# cat -n demo4.sh 1 #!/bin/bash 2 str1="hello" 3 str2="world" 4 str3="hello" 5 str4="" 6 #完全一样 7 test "ll" = "ls" 8 echo $? 9 echo "=============" 10 #"$str1 != $str2"是一个字符串,test 字符串 默认测试字符串,返回0 11 test "$str1 != $str3" 12 echo $? 13 echo "=============" 14 test $str1 = $str3 15 echo $? 16 test $str1 = $str2 17 echo $? 18 #不一样 19 test $str1 != $str2 20 echo $? 21 test $str1 != $str3 22 echo $? 23 #为0 24 test -z $str4 25 echo $? 26 test -z $str3 27 echo $? root@ubuntu:/Liunx/shell/shuzu# bash demo4.sh 1 ============= 0 ============= 0 1 0 1 0 1
注:比较时等号两边需要有空格,不然默认返回0
(2).整数的测试
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不相等
a -gt b 测试a是否大于b
a -lt b 测试a是否小于b
a -ge b 测试a是否大于等于b
a -le b 测试a是否小于等于b
root@ubuntu:/Liunx/shell/shuzu# cat -n demo5.sh 1 #!/bin/bash 2 sum1=2 3 sum2=3 4 echo $sum1 -eq $sum2 5 test $sum1 -eq $sum2 6 echo $? 7 echo $sum1 -ne $sum2 8 test $sum1 -ne $sum2 9 echo $? 10 echo $sum1 -gt $sum2 11 test $sum1 -gt $sum2 12 echo $? 13 echo $sum1 -lt $sum2 14 test $sum1 -lt $sum2 15 echo $? 16 echo $sum1 -ge $sum2 17 test $sum1 -ge $sum2 18 echo $? 19 echo $sum1 -le $sum2 20 test $sum1 -le $sum2 21 echo $? root@ubuntu:/Liunx/shell/shuzu# bash demo5.sh 2 -eq 3 1 2 -ne 3 0 2 -gt 3 1 2 -lt 3 0 2 -ge 3 1 2 -le 3 0
牢记:
【-eq 等于】 【 -ne 不等于】
【 -gt 大于】 【-lt 小于】
【-ge 大于等于】 【-le 小于等于】
(3).文件的测试:
-d name 测试文件是否是目录
-e name 测试文件是否存在
-f name 测试文件是否是普通文件
-L name 测试文件是否是链接文件
-r name 测试文件是否可读
-w name 测试文件是否可写
-x name 测试文件是的可执行
-s name 测试文件是否存在并且长度不为0
root@ubuntu:/Liunx/shell/shuzu# cat -n demo6.sh 1 #!/bin/bash 2 test -e $0 3 echo $? 4 test -f $0 5 echo $? 6 test -d $1 7 echo $? 8 test -L $2 9 echo $? 10 test -r $0 11 echo $? 12 test -w $0 13 echo $? 14 test -x $0 15 echo $? 16 test -s $0 17 echo $? root@ubuntu:/Liunx/shell/shuzu# bash demo6.sh demo2.sh demo3.sh 0 0 1 1 0 0 1 0 root@ubuntu:/Liunx/shell/shuzu# ll demo6.sh -rw-r--r-- 1 root root 164 4月 21 12:46 demo6.sh
f1 -nt f2 测试文件f1是否比文件f2更新
f1 -ot f2 测试文件f1是否比文件f2更旧
root@ubuntu:/Liunx/shell/shuzu# cat -n demo6_1.sh 1 #!/bin/bash 2 test $1 -nt $2 3 echo $? 4 test $1 -ot $2 5 echo $? root@ubuntu:/Liunx/shell/shuzu# bash demo6_1.sh demo1.sh demo2.sh 1 0 root@ubuntu:/Liunx/shell/shuzu# ll demo1.sh -rw-r--r-- 1 root root 283 4月 21 10:13 demo1.sh root@ubuntu:/Liunx/shell/shuzu# ll demo2.sh -rw-r--r-- 1 root root 152 4月 21 10:24 demo2.sh
=========================================================================
shell中的运算
expr:主要是进行一些简单整数的运算,包括加(+),减(-),乘(转义字符 *),整除(/),除取余(%)
root@ubuntu:/Liunx/shell/yunsuan# bash demo1.sh 9 1 20 1 1 root@ubuntu:/Liunx/shell/yunsuan# cat -n demo1.sh 1 #!/bin/bash 2 expr 5 + 4 3 expr 5 - 4 4 expr 5 \* 4 5 expr 5 / 4 6 expr 5 % 4
1.expr可以将结果主动的打印出来。
2.expr在引用变量的时候需要加水$
3.expr在运算的时候在运算符两边一定要加上空格
4.expr不支持自加自减操作
root@ubuntu:/Liunx/shell/yunsuan# bash demo2.sh 5/4 1 expr: syntax error: unexpected argument ‘++’ ++5 root@ubuntu:/Liunx/shell/yunsuan# cat -n demo2.sh 1 #!/bin/bash 2 sum1=4 3 sum2=5 4 #如果除开赋值符号,其他运算符号两边不加空格,机器则会默认成一个字符串,会原样输出,转义除外 5 expr $sum2/$sum1 6 expr $sum2 / $sum1 7 expr 5 ++ 8 expr ++5
5.expr在运算的时候如果要将运算结果赋值给变量那么必须使用命令置换。
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo3.sh 1 #!/bin/bash 2 #.expr在运算的时候如果要将运算结果赋值给变量那么必须使用命令置换 3 sum1=3 4 expr $sum1 + 2 5 sum2=7 6 #乘号、小括号需要转义 7 expr $sum2 \* \( $sum1 + 5 \) 8 #计算结果会直接输出,如果你希望将计算结果赋值给变量,那么需要将整个表达式用反引号``(位于 Tab 键的上方)包围起来 9 sum3=`expr $sum1 + 5` 10 echo $sum3 11 #回调函数: 通过函数指针调用函数,函数提供接口 12 root@ubuntu:/Liunx/shell/yunsuan# bash demo3.sh 5 56 8
3. 结构性语句:
(1).条件语句
(一)
if ...then ... fi
if 表达式
then 命令表
fi
如果表达式为真,则执行命令表中的命令,否则退出if语句
注:①命令表中命令可以是一条也可以是多条
②if和fi是条件语句的语句括号,必须成对的使用
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo4.sh 1 #!/bin/bash 2 #if...then...fi 3 sum1=2 4 sum2=2 5 if test $sum1 -eq $sum2 6 then 7 echo "num1 = num2" 8 echo $? 9 fi 10 root@ubuntu:/Liunx/shell/yunsuan# bash demo4.sh num1 = num2 0
(二).
if 表达式
then
命令表1
else
命令表2
fi
如果表达式成立则执行命令表1的内容,否则执行命令表2的内容
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo4.sh 1 #!/bin/bash 2 #if...then...fi 3 sum1=1 4 sum2=2 5 if test $sum1 -eq $sum2 6 then 7 echo "num1 = num2" 8 echo $? 9 else 10 echo "num1 != sum2" 11 echo $? 12 fi 13 root@ubuntu:/Liunx/shell/yunsuan# bash demo4.sh num1 != sum2 0
(三).
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
else
命令表3
fi
如果表达式1成立则执行命令表1的内容,表达式2成立则执行命令表2的内容,否则执行命令表3的内容
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo4.sh 1 #!/bin/bash 2 #if...then...fi 3 sum1=1 4 sum2=2 5 if test $sum1 -eq $sum2 6 then 7 echo "num1 = num2" 8 echo $? 9 elif test $sum1 -ge $sum2 10 then 11 echo "num1 >= sum2" 12 echo $? 13 elif test $sum1 -gt $sum2 14 then 15 echo "num1 > num2" 16 echo $? 17 else 18 echo "num1 < num2" 19 fi 20 root@ubuntu:/Liunx/shell/yunsuan# bash demo4.sh num1 < num2
(四).
if 表达式1
then
命令表1
else if 表达式2
then
命令表2
else
命令表3
fi
fi
如果表达式1成立则执行命令表1的内容,否则执行表达式2中的内容,如果表达式2成立则执行命令表2的内容,否则执行命令表3的内容
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo4.sh 1 #!/bin/bash 2 #if...then...fi 3 sum1=1 4 sum2=2 5 if test $sum1 -eq $sum2 6 then 7 echo "num1 = num2" 8 echo $? 9 elif test $sum1 -ge $sum2 10 then 11 echo "num1 >= sum2" 12 echo $? 13 else if test $sum1 -gt $sum2 14 then 15 echo "num1 > num2" 16 echo $? 17 else 18 echo "num1 < num2" 19 fi 20 fi 21 root@ubuntu:/Liunx/shell/yunsuan# bash demo4.sh num1 < num2
举例:输入一个年份,判断是不是闰年。
①
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo5.sh 1 #!/bin/bash 2 #举例:输入一个年份,判断是不是闰年。 3 echo "请输入一个年份:" 4 read year 5 echo $year 6 if (($year % 4 == 0 && $year % 100 != 0)) 7 then 8 echo "这是闰年" 9 elif (($year % 400 == 0)) 10 then 11 echo "这是闰年" 12 else 13 echo "这不是闰年" 14 fi 15 root@ubuntu:/Liunx/shell/yunsuan# bash demo5.sh 请输入一个年份: 2020 2020 这是闰年 root@ubuntu:/Liunx/shell/yunsuan# bash demo5.sh 请输入一个年份: 2021 2021 这不是闰年
②
root@ubuntu:/Liunx/shell/yunsuan# cat -n demo5.sh 1 #!/bin/bash 2 #举例:输入一个年份,判断是不是闰年。 3 echo "请输入一个年份:" 4 read year 5 echo $year 6 #不可以使⽤ && 和 || 符号,只能⽤-a和-o;或者在 if 语句中使⽤ 7 if [ $(($year % 4)) -eq 0 ] && [ $(($year % 100)) -ne 0 ] 8 then 9 echo "这是闰年" 10 elif [ $(($year % 400)) -eq 0 ] 11 then 12 echo "这是闰年" 13 else 14 echo "这不是闰年" 15 fi 16 root@ubuntu:/Liunx/shell/yunsuan# bash demo5.sh 请输入一个年份: 2020 2020 这是闰年 root@ubuntu:/Liunx/shell/yunsuan# bash demo5.sh 请输入一个年份: 2021 2021 这不是闰年
举例:输入一个文件判断是否是普通文件,如果是判断是否有写的权限,如果有写的权限则直接写入hellowrold ,如果没有写的权限则给文件增加写的权限再写入hellowrold.
(2)多路分支语句
case...esac
case 字符串变量 in
模式1) 命令表1 ;;
模式2) 命令表 2;;
模式3|模式4) 命令表3 ;;
*)命令表n;;
esac
#!/bin/bash read i case $i in 1) echo "1" ;; 2) echo "2" ;; 3 | 4) echo "3" ;; *) echo "0" ;; esac
注意:
1.case语句只能检测字符串变量
2.个模式必须以右括号结束
3.一次可以匹配多个模式用“|”分开
4.命令表以双分号来表示行结束,退出case语句
5.字符*号表示其他的模式
6.最后一个双分号行可以省略不写
举例:输入成绩打印对应的等级
(3)while / do...while 循环语句
while...do...done
语法结构:
while 命令或者表达式
do
命令表
done
#!/bin/bash num=1 while test $num -lt 6 do echo "$num" num=`expr $num + 1` done
while语句先测试后面的命令或者表达式的值,如果为真,就执行一次循环体中的命令,然后在测试该命令或者表达式的值,如果为真又执行一次循环体中的命令,直到命令或者表达式为假的时候退出循环。
举例:实现1-100的和
举例:猜数字的小游戏
产生随机数:
num=$[RANDOM%100] //表示产生一个100以内的随机数,并且赋值给num
(4)for循环语句
for...do...done
语法结构:
for 变量名 in 单词表
do
命令表
done
变量依次取单词表中的各个单词,每取一次单词就执行一次循环体放入命令,也就是说循环的次数是由 单词表的数量决定的
提示:
seq //序列
seq 尾数 // seq 100 表示默认是从1开始,每次加1,直到100结束
seq 增量 尾数 //seq 1 100 表示从1开始每次加1 加到100
seq 首数 增量 尾数 //seq 1 1 100 表示从1开始每次加1加到100结束
#!/bin/bash sum=0 for i in 1 3 5 7 do sum=`expr $sum + 1` done echo $sum #!/bin/bash sum=0 for i in `seq 9` do sum=`expr $sum + 1` done echo $sum
举例:打印99乘法表
#!/bin/bash sum=1 for i in `seq 9` do for j in `seq $i` do sum=`expr $i \* $j` echo -n "$i*$j=$sum" done echo done
=========================================================================
shell函数:
1.在shell程序中,常常把完成
目录
固定功能,且多次使用的一组命令封装在一个函数里,在每次使用的时候只需要调用该函数名就可以。
2.函数在调用的时候必须先定义。
3.调用函数的时候可以传参数给函数,函数可以用return语句将结果返回给调用程序。
函数定义形式:
function 函数名()
{
命令表或者语句
}
1.function代表这个是一个函数
2.shell的函数没有参数列表
3.在shell中没有返回值类型
4.在shell函数中使用的变量默认都是全局变量
5.用local修饰的变量是局部变量
函数调用:
函数名
函数名 传入的参数
1. #!/bin/bash function add() { sum=$((10+10)) } add echo $sum 2. #!/bin/bash function add() { sum=$[$1+$2] } add 10 20 echo $sum
我们可以通过echo $? 来获取返回值
$${}的应用
$${mod}是一个变量替换的语法,用于在Shell脚本中引用变量的值。
在Shell脚本中,$符号用于引用变量,而{}用于界定变量的范围。
当${mod}被解析时,Shell会将其替换为mod变量的值。
例如,如果mod的值为module1,那么$${mod}会被解析为${module1},然后Shell会将${module1}替换为module1变量的值
更改静态MAC地址:ifconfig eth0 hw ether 00:00:00:01:00:05
查看安装的linux内核:dpkg -l | grep linux