day02(Linux)Shell脚本

Shell脚本

一.shell脚本基础概念

1.1 概念

shell使用方式:手动在命令行下命令和用shell脚本

shell脚本本质:shell命令的有序集合,扩展名可以为sh见名知意,也可以没有。

shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。

解释型语句:不需要编译,解释一条执行一条,python、shell脚本。

编译型语句:需要用编译器gcc,g++来进行编译,比如C语言

1.2 创建和执行

新建一个shell脚本: touch xx.sh

第一行必须为: #!/bin/bash

意思是使用/bin/bash来解释执行

执行方式:

  1. 使脚本具有执行权限: chmod 权限 xx.sh
  2. 执行: ./xx.sh

练习:

1)在当前路径下创建file_1到file_5, 5个普通文件

2)删除 file_2和file_3文件(使用通配符)

3)将剩下的file文件用tar压缩成bz2的格式

4)将压缩文件复制到家目录下

5)进入到家目录解压压缩文件

6)删除压缩包

二.变量

2.1 用户自定义变量

一般用大写

进行赋值用=,左右两边不能有空格

引用变量前面加$

2.2 位置变量

$0或者${0}是命令行的第一个参数,也就是包含脚本名的参数./xx.sh

$1,$2...就是剩下的第二个第三个命令行参数了,以此类推

$# 所有命令行参数的个数(除了第一个命令行参数)

$@或者$* 所有命令行参数(除了第一个命令行参数)

C语言命令行参数复习:

2.3 预定义变量

$? 前一个命令的退出状态(0为真非0为假)

$$ 正在执行进程的ID号

2.4 环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

HOME: /etc/passwd文件中列出的用户主目录

PATH :shell搜索路径,就是是一系列目录,当执行命令时,linux就在这些目录下查找。

三.功能语句

3.1 说明性语句

以#开头是注释,起解释说明作用

3.2 功能性语句

3.2.1 read

功能:read从标准输入读入一行,并且赋值给后面的变量

格式:read V1 V2 V3

把读入行中的第一个单词赋值给V1变量,第二个单词赋值给V2,以此类推,把其余所有单词赋值给最后一个变量。

read -p "提示语句" 变量列表: 可以将提示语句输出,同时输入变量

3.2.2 expr

expr 表达式

注意:表达式符号间必须用空格,元素要用$引用

可以直接输出结果,不过脚本里一般结合命令置换符把结果重新赋值给其他变量。

算术运算符命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和取余数(%)等操作, 小括号前面也要加\

练习1:通过expr实现变量自加运算(++i)

#!/bin/bash
I=0
#I=`expr $I + 1`
((++I))
echo $I

练习2:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18

要求:

1)从终端读入4个数a,b,c,d

2)进行运算

3)打印结果输出到终端

#!/bin/bash
read a b c d
#NUM=`expr $a \* $b + $c - $d / $b`
((NUM=a*b+c-d/b))
echo $NUM
补充:也可以用双圆括号(())进行运算,里面表达式和C语言写法一样

3.2.3 test

可测试对象三种:字符串 整数 文件属性

每种测试对象都有若干测试操作符

1)字符串的测试:

s1 = s2 测试两个字符串的内容是否完全一样

s1 != s2 测试两个字符串的内容是否有差异

-z s1 测试s1 字符串的长度是否为0

-n s1 测试s1 字符串的长度是否不为0

2)整数的测试:

a -eq b 测试a 与b 是否相等 equal

a -ne b 测试a 与b 是否不相等 not equal

a -gt b 测试a 是否大于b greater than

a -ge b 测试a 是否大于等于b greater equal

a -lt b 测试a 是否小于b litter than

a -le b 测试a 是否小于等于b litter equal

3)文件属性的测试:

-d name 测试name 是否为一个目录

-f name 测试name 是否为普通文件

-e name 测试文件是否存在

#!/bin/bash
#测试字符串
VAR="hello"
test $VAR = "hello"
echo $? 

test $VAR != "hello"
echo $? 

test -z $VAR
echo $?

test -n $VAR
echo $?

#测试整数
test 10 -eq 5
echo $?

test 10 -ne 5
echo $?

test 10 -gt 5
echo $?

test 10 -lt 5
echo $?

#测试文件属性
read -p "input filename: " FILE
test -e $FILE
echo $?

test -f $FILE
echo $?

test -d $FILE
echo $?

3.3 结构性语句

3.3.1 if语句
基本结构:
if 条件
then
    命令表1
else
    命令表2
fi
多路分支结构:
if 条件1
then
    命令表1
elif 条件2
then
    命令表2
fi
嵌套结构:
if 条件1
then
    if 条件2
    then
        命令表1
    fi
else
    命令表2
fi
if可以结合着test判断:
也可以使用操作符[],但是需要前后有空格

补充操作符:

-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true

-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false

! 非运算 例如 [ ! false ] 返回 true

&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true

| 位或 例如 echo $[2|2]

&位与 例如 echo $[2&1]

3.3.2 case 语句

格式:

case 变量 in
模式1)
    命令表1
    ;;
模式2)
    命令表2
    ;;
*)
    命令表n
    ;;
esac

例子:

#!/bin/bash
read -p "input number: " NUM

case $NUM in 
1)
    echo "1"
    ;;
10)
    echo "10"
    ;;
100|9[0-9])
    echo "90-100"
    ;;
*)
    echo "other"
    ;;
esac

练习:学生成绩管理系统,用shell中的case实现

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

#!/bin/bash
read -p "input number: " NUM 
case $NUM in 
9[0-9]|100)
    echo "A"
    ;;
8[0-9])
    echo "B"
    ;;
7[0-9])
    echo "C"
    ;;
6[0-9])
    echo "D"
    ;;
[1-5][0-9]|[0-9])
    echo "lost!"
    ;;
*)
    echo "input err"
    ;;
esac
3.3.3 for循环

格式:

for 变量名 in 单词表
do
    命令表
done

变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

for语句的几种书写格式:

1)for i in 1 2 3 4 do....done :

变量i从单词表中取值

2)for i do...done:

变量i从命令行取值,可以省略in单词表

3)for i in {1..10} do...done:

变量i从1-10个数中取值

4)for ((i = 0; i < 10; i++)) do...done:

书写格式类似c语言

3.3.4 while

格式:

while 命令或表达式
do
    命令表
done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

练习:分别用for和while实现1-10求和

#!/bin/bash

NUM=0
i=1
while test $i -le 10
do
    ((NUM=NUM+i))
    ((i++))
done
echo $NUM 

#####################
SUM=0
for ((i=1;i<=10;i++))
do
    ((SUM=SUM+i))
done
echo $SUM
3.3.5 循环控制语句

break n: 结束n层循环

continue n: 结束n层的本次循环,继续下一次循环

#!/bin/bash

for ((i=0;i<5;i++)) 
do 
    for ((j=0;j<5;j++)) 
    do 
        if [ $j -eq 3 ]
        then
            #break 1
            #break 2
            #continue 1 
            continue 2
        fi
        echo "$i : $j"  
    done 
done 

四.数组

4.1 数组的赋值

  1. arr=(1 2 3 4 5)
  2. arr=($1 $2 $3...)
  3. read a b c
    arr=($a $b $c)
  4. read -a arr

4.2 数组的调用

${arr[i]} #引用数组元素,数组元素下标从0开始到n-1结束

arr[i]=10 #对数组元素重新赋值

${arr[@]} #遍历数组

${#arr[@]} #数组元素的个数

例子:

练习:从终端输入3个整数,输出三个数中的最小值

冒泡排序:

五.函数

5.1 函数定义方式

(1)函数名()

{

命令表

}

(2)function 函数名()

{

命令表

}

5.2 函数调用

函数名 参数列表

#!/bin/bash

fun ()
{
    echo "hello world"
}

function add()
{
    ((NUM=$1 + $2))
    echo $NUM
}

fun
add 1 2

函数内 $1 $2 表示的是传递给函数的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值