第十章 学习shell script

目录

shell script简介

简单的shell script练习

简单范例:read参数

三种执行脚本的方法

数值运算

返回值

数字、字符比较

test比较

[ ]比较

多条语句判断

条件判断式

if判断式

case语句

select匹配选择

function函数

循环(loop)

while循环

until循环

for循环

 


shell script简介

Shell Script ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

脚本开头格式:#!/bin/bash

注:除了开头第一行的井号外,其余所有井号开头的都是注释

        echo $$是查看当前的shell的shell id


简单的shell script练习

简单范例:read参数

read命令表示从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。当系统遇到read的时候程序就不会往下运行了,而是需要等待用户输入信息

例:

#!/bin/bash

#这是我的第一个脚本

read -p "请输入你的名字:"  name

echo "你好,$name"

注:如果没有声明变量,系统则会使用默认的变量$REPLY

 

三种执行脚本的方法

./xx.sh

bash xx.sh

source xx.sh

注:./xx.sh 和 bash xx.sh 的执行方法都是打开一个子shell来运行的;而使用source则是在当前shell下运行的;


数值运算

声明整型变量:declare -i

注:在申明变量时如果不加i参数,申请的变量默认是字符型的;不能用于数值的运算

 

let

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来

例:let bb=1+8

 

例:(()) 也可以直接表示运算操作


返回值

当我们在系统中执行命令的时候,命令执行的结果只会返回正确或者错误的信息;在linux中这些命令执行的结果信息被存放在容器中;且容器中只能保存上一次命令执行的结果;正确的结果返回值是0,如果是错误的结果返回值就是一个不为0的数

查看上一次命令的返回值:echo $?

 

数字、字符比较

在Linux中,数字和字符的比较时所用到的符号是不一样的,如下表所示:

 

test比较

例:test $aa -eq $bb               

 

[ ]比较

[ $aa -gt $bb ]                     []用来比较;返回值为假

 

[ ]除了可以用来 比较变量的大小,还可以用来判断文件的一些属性,例如:

[ -f /etc/passwd ]               -f属性用来判断文件是否存在

[ -r /etc/passwd ]              -r属性用来判断是否具有读权限

[ -w /etc/passwd ]             -w属性用来判断是否具有写权限

[ -x /etc/passwd ]              -x属性用来判断是否具有执行权限

[ -z /etc/passwd ]              -z属性用来判断字符是否存在


多条语句判断

判断1 && 判断2 (同真为真)

例:[ $aa -gt $bb] && echo OK

注:当判断1为假时,后面的判断2就不执行了

 

判断1 || 判断2     (一个为真即为真)

例:[ $aa -gt $bb] || echo OK

注:当判断1为真的时候,后面的判断2就不执行了


条件判断式

if判断式

语法格式:

#!/bin/bash
if    判断语句; then
      xx
elif  判断语句; then
      yy
else  zz
fi

例1:

#!/bin/bash
grep -q ^$1 /etc/passwd
if [ "$?" -eq 0 ]; then
        echo "$1 exist"
else
        echo "not exist $1"
fi

例2:

#!/bin/bash
read -p "Enter your ages:" age
if   [ $age -le 0 ] || [ $age -gt 150 ]; then
        echo "please enter a corect age!"
elif [ $age -gt 0 ] && [$age -lt 20 ]; then
        echo "hello young people!"
elif [ $age -gt 20 ] && [ $age -le 50 ]; then
        echo "hello adult!"
else    echo "hello aged!"
fi

 

case语句

语法格式:

#!/bin/bash
case 变量 in
    
       值1)    xx
           ;;

       值2)    yy
           ;;
esac

 

例1:

#!/bin/bash
case $1 in
        [Tt]o*)
                echo tom
                ;;

        bob | mary)
                echo xxx
                ;;

        *)
                echo zzz
                ;;
esac

运行结果:

 

例2:

#!/bin/bash
#here 文档的写法
cat <<END
        1) tom
        2) bob
        3) mary
END
read -p "please shoice a number:" nu
case $nu in
        1)
                echo tom
                ;;
        2)
                echo bob
                ;;
        3)
                echo mary
esac

运行结果:

 

select匹配选择

例:

#!/bin/bash
PS3="Please select the command you want to execute :"
select xx in 'ls -l' pwd date
do
        $xx
done

运行结果:

 

function函数

在Linux中可以通过定义一些特定的方法,以便于在多次使用的时候直接调用;这些方法我们称之为函数

定义函数的格式:

#!/bin/bash
#函数的定义方法
function 方法名 (){
    
        方法体

    }

#注:关键字function也可以不写,直接使用方法名

例:

#!/bin/bash
function xx (){
        date
}

xx
#xx表示调用这个函数

运行结果:


循环(loop)

while循环

#!/bin/bash
sum=0
while [ "$sum" -lt 10 ]
do
        let sum+=1
        echo $sum
done



#while的语法格式
while 条件
do
    循环体
done

注:while循环是满足条件之后,再去执行循环体中的内容;直到不满足条件才会跳出循环

 

until循环

#!/bin/bash
xx=0
until [ "$xx" -gt 24 ]
do
        case "$xx" in
                [0-9] | 1[01])
                        echo "good morning!"
                        ;;
                12)
                        echo "time to reast!"
                        ;;
                1[3-7])
                        echo "good afternoon!"
                        ;;
                *)
                        echo "good evening!"
        esac
                let xx+=1
done


#until的语法格式
until 条件
do
    循环体
done

注:until与while原理相反,until先执行循环体再做判断;

 

for循环

for循环的语法格式:

for xx in 值1 值2 值3
do
	循环体
done

例:

[root@localhost opt] 
[root@localhost opt] for i in *
> do
> cp $i ${i}.bak      #为当前目录的所有文件加上bak后缀
> done
[root@localhost opt] ll
总用量 56
-rwxr-xr-x. 1 root root 109 12月 26 14:22 cc.sh
-rwxr-xr-x. 1 root root 109 12月 26 15:05 cc.sh.bak
-rwxr-xr-x. 1 root root 240 12月 26 14:57 dd.sh
-rwxr-xr-x. 1 root root 240 12月 26 15:05 dd.sh.bak
-rw-r--r--. 1 root root  81 12月 25 13:45 test
-rw-r--r--. 1 root root  81 12月 26 15:05 test.bak
-rw-r--r--. 1 root root  36 12月 25 14:04 xx
-rw-r--r--. 1 root root  36 12月 26 15:05 xx.bak
-rwxr-xr-x. 1 root root 290 12月 26 11:38 xx.sh
-rwxr-xr-x. 1 root root 290 12月 26 15:05 xx.sh.bak
-rwxr-xr-x. 1 root root 106 12月 26 14:03 yy.sh
-rwxr-xr-x. 1 root root 106 12月 26 15:05 yy.sh.bak
-rwxr-xr-x. 1 root root 162 12月 26 14:13 zz.sh
-rwxr-xr-x. 1 root root 162 12月 26 15:05 zz.sh.bak

 

for嵌套循环:

#!/bin/bash
for i in a b c
do
        for j in 1 2 3
        do
                echo $i$j
        done
done

运行结果:

注:在for循环中,还可以写成如下形式:for((i=1;i<=10;i++)); for i in {1..10} 均表示取值范围为1~10


原创文章,转载请注明出处

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野亮光

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值