shell编程

目录

shell编程基础:

shell编程的基本过程:

变量的分类:

1.用户自定义的变量。

2.位置变量,

3.预定义变量

4.环境变量

字符串的相关操作:

1.字符串的拼接

2.字符串的拷贝

3.字符串的长度

4.提取字符串

shell数组:

数组的操作:整体赋值及数组成员变量的访问:

清除数组元素:unset arr[下标]

shell功能语句:

1.说明性语句

2.功能性的语句

①echo         注:echo语句自带换行功能

②read

③test:测试

(1).字符串测试

(2).整数的测试

(3).文件的测试:

 shell中的运算

3. 结构性语句:

举例:输入一个年份,判断是不是闰年。

(2)多路分支语句

(3)while / do...while 循环语句

(4)for循环语句

举例:打印99乘法表

 shell函数:


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程序中,常常把完成

目录

shell编程基础:

shell编程的基本过程:

变量的分类:

1.用户自定义的变量。

2.位置变量,

3.预定义变量

4.环境变量

字符串的相关操作:

1.字符串的拼接

2.字符串的拷贝

3.字符串的长度

4.提取字符串

shell数组:

数组的操作:整体赋值及数组成员变量的访问:

清除数组元素:unset arr[下标]

shell功能语句:

1.说明性语句

2.功能性的语句

①echo         注:echo语句自带换行功能

②read

③test:测试

(1).字符串测试

(2).整数的测试

(3).文件的测试:

 shell中的运算

3. 结构性语句:

举例:输入一个年份,判断是不是闰年。

(2)多路分支语句

(3)while / do...while 循环语句

(4)for循环语句

举例:打印99乘法表

 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值