shell脚本的基础知识

目录

一、什么是shell脚本

二、shell脚本的使用

 三、shell变量

    1)用户自定义变量

    2)预定义变量 

    3)环境变量

四、shell文件的构成

    1)说明性语句:     

    2)功能性语句:         

    3)结构性语句:       

五、shell里的功能语句

1.read

  2.expr

    注意

3.test

    1)字符串的测试

    2)整数的测试

     3)文件属性的测试

4.结构性语句

  1.if…then…fi

2.case...esac

3.for..do..done

5.shell数组

 1)数组的赋值

  2)数组的调用

6.关于shell脚本的使用

练习1:使用shell脚本完成如下操作

练习2:用shell实现计算器功能

练习3:用shell实现比较三个数的大小

练习4:用shell实现1-10求和运算

练习5:用shell实现冒泡排序


一、什么是shell脚本

        shell脚本简单来说就是Shell命令的有序集合。Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

换句话说,shell 脚本是使用 shell 的功能编写的程序。该程序使用纯文本文件,在其中写入一些 shell 语法和指令,然后使用常规符号、管道命令和数据流。

         具体介绍

 

二、shell脚本的使用

        1.首先创建脚本文件

               终端指令为:

touch a.sh

        这里新建一个命名为a的脚本文件(.sh)

        shell文件内部,可以写入命令,该命令可直接在终端运行。

        2.修改文件权限为777

                终端指令为:

chmod 777 a.sh

        3.执行脚本文件

               终端指令为:

./a.sh

这里简单写一个小脚本,该脚本实现将固定文件直接编译运行。

a.sh

 

#!/bin/bash

gcc text.c -o text

./text

text.c

#include<stdio.h>
int main()
{
    printf("kira\n");
    printf("111\n");
    return 0;
}

 终端执行结果:

 三、shell变量

Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),
将任何赋给变量的值都解释为一串字符。

    1)用户自定义变量

 
        在shell编程中通常使用全大写变量,方便识别 
        变量的调用:在变量前加$ 
        Linux Shell/bash从右向左赋值
        使用unset命令删除变量的赋值 


    2)预定义变量 


        $0   与键入的命令行一样,包含脚本文件名
        $1,$2,……$9  分别包含第一个到第九个命令行参数
        ${10}, ${11}  打印第十个、十一个命令行参数
        $#   包含命令行参数的个数(不包含脚本文件)
        $@   包含所有命令行参数:“$1,$2,……$9”
        $?    包含前一个命令的退出状态(0为真 1为假)
        $*    包含所有命令行参数:“$1,$2,……$9”

    3)环境变量

        一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
        HOME: /etc/passwd文件中列出的用户主目录     
        PATH :shell搜索路径;比如交叉编译工具的安装使用,在/etc/bash.bashrc文件中添加的内容。

四、shell文件的构成

 shell语句包括三类:说明性语句、功能性语句和结构性语句。、


    1)说明性语句:     


        以#号开始到该行结束,不被解释执行
        在shell脚本中经常会在第一行写到:#!/bin/bash ,解释如下:第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。第一行写错或者不写时,系统会有一个默认的bash解释器进行解释。


    2)功能性语句:         


        任意的shell命令、用户程序或其它shell程序。


    3)结构性语句:       


        条件测试语句、多路分支语句、循环语句、循环控制语句等。    

五、shell里的功能语句

1.read


    read  var1  var2  var3
    把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2,
    ……把其余所有的词赋给最后一个变量.


  2.expr


    算术运算命令expr主要用于进行简单的整数运算,包括加(+)、
    减(-)、乘(\*)、整除(/)和求模(%)等操作。
    如:
        $ expr  12  +  5  \*  3
        $ sum=`expr  2  \*  6 `
        $ echo  $sum


    注意


            1)不能直接使用(),如果使用需加上\(\),用作转意,如expr /( 3 + 3 /) / 3
            2)运算符和数字之间需要加上空格,如果有括号括号前后也有空格
            3)实现自加运算:
                a=`expr $a + 1`  或  ((a++))

3.test


    test语句可测试三种对象:
          字符串     整数     文件属性
    每种测试对象都有若干测试操作符


    1)字符串的测试


        s1 = s2     测试两个字符串的内容是否完全一样
        s1 != s2    测试两个字符串的内容是否有差异
        -z s1         测试s1 字符串的长度是否为0
        -n s1         测试s1 字符串的长度是否不为0


    2)整数的测试


        a -eq b         测试a 与b 是否相等
        a -ne b            测试a 与b 是否不相等
        a -gt b         测试a 是否大于b
        a -ge b         测试a 是否大于等于b
        a -lt b         测试a 是否小于b
        a -le b         测试a 是否小于等于b  

 
    3)文件属性的测试


        -d name         测试name 是否为一个目录
        -f name         测试name 是否为普通文件
        -e name         测试文件是否存在

4.结构性语句


  1.if…then…fi


    1)基本结构:
        if    表达式
        then  
            命令表
        fi     
    2)多层结构:
        if      表达式1
        then 
            命令表1
        elif    表达式2  
        then 
            命令表2
        fi
    3)嵌套结构:
        if      表达式
        then 
            命令表1
        else  
            if    表达式
            then  
                命令表
            fi  
        fi
    注意:
        如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 
      即执行fi后面的语句。 
        if和fi是条件语句的语句括号, 必须成对使用;
        命令表中的命令可以是一条, 也可以是若干条。

2.case...esac


    case   字符串变量   in
        模式1)
                命令表1
                ;;
        模式2)
                命令表2
                ;;
             ……
        模式n)
                命令表n
                ;;
    esac
    注意:
        1)case语句只能检测字符串变量
        2)命令表以单独的双分号行结束,退出case语句
        3)模式 n常写为字符* 表示所有其它模式
        4)case匹配项中可以存在多个模式,每种模式之间用|隔开

3.for..do..done


    格式:
        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语言

5.shell数组

 1)数组的赋值


    a.array=(10 9 8 7 6 5)
    b.array=($1 $2 $3...)
    c.read a b c
      array=($a $b $c)
    d.read -a array


  2)数组的调用


    ${array[i]} //数组下标从0开始到n-1结束
    array[i]=3  //对数组元素重新赋值
    ${array[@]} //遍历数组
    ${#array[@]} //计算数组中元素的个数

6.关于shell脚本的使用

练习1:使用shell脚本完成如下操作


    1)在当前路径下创建file_1到file_5,5个普通文件
    2)删除 file_2和file_3文件,(使用通配符)
    3)将剩下的file文件用tar压缩成bz2的格式
    4)将压缩文件复制到家目录下
    5)进入到家目录解压压缩文件
    6)删除压缩包

shall指令:

#!/bin/bash 
rm file_*

touch file_1
touch file_2
touch file_3
touch file_4
touch file_5

rm file_2
rm file_3

tar -cvjf file.tar.bz2 file_*

cp file.tar.bz2 ~/23021/
cd ~/23021/

tar -xjvf file.tar.bz2

rm file.tar.bz2

练习2:用shell实现计算器功能

计算表达式值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


case $b in
    +)
    echo  $a $b $c "=" `expr $a + $c`
    ;;

    -)
    echo $a $b $c "=" `expr $a - $c`
    ;;

    \*)
    echo "$a $b $c = `expr $a \* $c`"
    ;;

    /)
    echo $a $b $c "=" `expr $a / $c`
    ;;
    
    *)
    echo "error"
    ;;
esac

注意其中case里面乘法部分,\*会被认为是打印所有的文件名,故要使用双引号将其限制。

练习3:用shell实现比较三个数的大小

从终端输入3个整数;从小到大排序

做法一:

用if嵌套

#!/bin/bash
read a b c


if test $a -eq $b
then
    if test $a -eq $c
    then
        echo "三者相等"
    elif test $a -gt $c
    then
        echo $c $b $a "其中ab相等"
    else 
        echo $b $a $c "其中ab相等"
    fi
fi
if test $b -eq $c
then
    if test $a -eq $c
    then
        echo " "
    elif test $a -gt $c
    then
        echo $c $b $a "其中bc相等"
    else 
        echo $a $b $c "其中bc相等"
    fi
fi

if test $a -eq $c
then
    if test $b -eq $c
    then
        echo " "
    elif test $b -gt $c
    then
        echo $c $a $b "其中ac相等"
    else 
        echo $b $a $c "其中ac相等"
    fi
fi





if test $a -gt $b
then
    if test $b -gt $c
    then
        echo $c $b $a
    fi
    if test $c -gt $a
    then
        echo $b $a $c
    fi

    if test $c -gt $b
    then
    if test $a -gt $c
    then 
        echo $b $c $a
    fi
    fi
fi

if test $b -gt $a
then
    if test $a -gt $c
    then
        echo $c $a $b
    fi
    if test $c -gt $b
    then
        echo $a $b $c
    fi

    if test $c -gt $a
    then
    if test $b -gt $c 
    then
        echo $a $c $b
    fi
    fi
fi

做法二:引入中间变量

#!/bin/bash
read a b c

if [ $a -gt $b ]
then
    t=$a
    a=$b
    b=$t
fi

if [ $a -gt $c ]
then
    t=$a
    a=$c
    c=$t
fi

if [ $b -gt $c ]
then
    t=$b
    b=$c
    c=$t
fi


echo $a $b $c

练习4:用shell实现1-10求和运算

方法一:使用for实现

#!/bin/bash

for i in 1 2 3 4 5 6 7 8 9 10
do
    sum=`expr $sum + $i`

done
    echo $sum

方法二:使用while实现

#!/bin/bash

i=1
sum=0
while [ $i -lt 11 ]
do 
    sum=`expr $sum + $i`
    ((i++))
done
echo $sum

练习5:用shell实现冒泡排序

用冒泡排序实现10个数的从小到大排序

#!/bin/bash

arr=()
a=0
for ((;;))
do
    read arr[a]
    ((a++))
    if [ $a -eq 10 ]
    then
        break
    fi
done




i=0
j=0
for((i=0;i<10;i++))
do
    for((j=0;j<10-i;j++))
    do
        a=`expr $j + 1`
        #echo $a
        if [[ ${arr[j]} -gt ${arr[a]} ]]
        then
            t=${arr[$j]}
            arr[j]=${arr[$a]}
            arr[a]=$t
        fi
    done

done
echo ${arr[@]}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值