Linux C语言高级学习第三天(Shell编程)

Shell的作用:

答:对内保护内核,对外给用户提供一个访问的窗口

编程语言的分类:

1.面向对象;面向过程

2.编译型编程语言;解释型编程语言(今天要讲的)--->分清:代码、程序、进程

         用编译器            用解释器            -->产生可运行的程序

编译型:

  • 需要编译器

  • 对代码进行整体检查。如果代码中间有语法错误,则报错停止编译;如果没有错误,则将代码生成目标文件

解释型:

  • 需要解释器

  • 对代码进行逐句操作。如果代码中间某句有错误,则该句不被执行,但该句之前的代码已经执行。

二者比较的话,编译型的执行效率高,而解释型可移植性好

shell脚本需要的解释器就是shell本身

编写一个shell脚本

1.使用文本编辑器编译脚本文件.sh

        #!/bin/bash

2.给shell脚本文件添加可执行权限

        chmod 0775 ***.sh

3.执行脚本

shell 脚本变量--->shell编程唯一的一种变量类型:字符串类型

1.用户自定义变量

    变量无需定义,直接使用;给变量赋值时,赋值号左右绝对不可以加空格-->加空格就是判等

    如果使用该变量的值,则需要在该变量名前加  $

#!/bin/bash
A=3
B=4
echo "A is $A"
echo "B is $B"

 

#!/bin/bash
num=1
echo "I am ${num}nd"

 如果变量名有粘连,可以用{}强调输出的变量-->I am ${num}nd

2.位置变量(命令行参数变量)

$0               命令本身

$1~$9        不同位置的命令行参数

#!/bin/bash
echo "0 is $0"
echo "1 is $1"
echo "2 is $2"
echo "3 is $3"
echo "4 is $4"

3.预定义变量

    $#         命令行参数的个数

    $@        所有命令行参数(不计$0,同$*)

    $?          前一个命令的退出状态--->返回:0 是真;1 是假。PS:C语言中的  return 0;  就是为了给内核看,正常结束了

    $*          所有命令行参数(不计$0,同$@)

    $$          正在执行的进程ID号

echo "# is $#"
echo "@ is $@"
echo "* is $*"
echo "$ is $$"

4.环境变量

    HOME        用户工作目录所在地址,在文件/etc/passwd文件内存储-->不能写~   要写:$HOME

#!/bin/bash
mkdir $HOME/study/Home

  IFS(Internal Field Separator) 内部字段分隔符,默认是空格、tab以及换行符

    PATH        Shell搜索路径

    PS1            命令提示符格式($及$前的字符)(PS是Prompt Sign的缩写)

    PS2            换行提示符>

    TERM        终端类型,常见的值有vt100、vt200、ansi、xterm等

    HISTSIZE    保存历史记录的条目数

    LOGNAME        当前登录用户名

    HOSTNAME    主机名称

    SHELL        当前使用的Shell类型

    LANG/LANGUAGE与语言相关的环境变量

    MAIL        用户的邮件存放目录

    TMOUT        设置的脚本过期时间。例如TMOUT=3则表示该脚本3秒后过期

    UID            登录用户的ID

    USER        显示当前用户名

    SECONDS        记录脚本从开始运行到结束耗费的时间

    env   可以查看所有的环境变量

Shell 的语句

1.说明性语句

    以#开头的语句。说明性语句在脚本执行期间不会执行(解释说明的作用)

    #!/bin/bash  也是说明性语句-->说明当前脚本文件作用Shell版本信息

2.功能性语句

    三个特有的功能性语句:

  •     read-->读取数据(都是字符串)两种读法:①一个read语句一次性读完输入完了再按回车②多个read每次读一个每读一个回车一次

#!/bin/bash
read DIR
ls -l $DIR
  •     expr-->算术运算:+  -   \*    /    %   各符号前后都要加一个空格,否则就会被认为一个字符串

#!/bin/bash
read VIR1 VIR2
ADD=`expr $VIR1 + $VIR2`
SUB=`expr $VIR1 - $VIR2`
MUL=`expr $VIR1 \* $VIR2`
DIV=`expr $VIR1 / $VIR2`
MOD=`expr $VIR1 % $VIR2`
echo "ADD is $ADD"
echo "SUB is $SUB"
echo "MUL is $MUL"
echo "DIV is $DIV"
echo "MOD is $MOD"

要想先计算再赋值,就需要加反引号``-->作用:优先执行该命令并且使用该命令的结果

  •     test-->测试语句:可以测试字符串;测试整数;文件类型

                test "hello"="hello"-->使用echo $?来查看比较结果-->等价于[ "hello"="hello" ]            -->结合结构性语句里的  if  组合使用;结合||  !  &&

                注:左右方括号都要加一个空格

                   (1)测试字符串

                            [ 字符串1 = 字符串2 ]    #判定两个字符串是否相等

                            [ 字符串1 != 字符串2 ]    #判定两个字符串是否不相等

                            [ -z 字符串 ]                   #判定字符串长度是否一致

                   (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

PS:

equal                     相等

not equal              不相等

greater than          大于

greater equal        大于等于

less than                小于

less equal              小于等于

newer than            新于……

older than              旧于……

                   (3)测试文件类型

-e name        测试一个文件是否存在

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

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

-L/h name    测试name是否为符号链接

-r name        测试name文件是否存在且可读

-w name        测试name文件是否存在且可写

-x name        测试name文件是否存在且可执行

-s name        测试文件是否存在且文件长度不为0

f1 -nt f2    测试文件f1是否比文件f2更新

f1 -ot f2    测试文件f1是否比文件f2更旧

3.结构性语句

(1)二重分支if-else

if 条件1

then 

        语句1

elif 条件2

then

        语句2

else

        语句3

fi

#!/bin/bash
read WHO
if [ $WHO -gt 0 ]
    then
        echo "这就是一个正数!!"
elif [ $WHO -lt 0 ]
then
    echo "这是一个负数!!!"
else
    echo "没错,这是0!!!!!!"
fi

(2)多重分支case

#!/bin/bash
read what
case $what in
    file1)
        echo "这是 file1 呀!"
        ;;
    file2)
        echo "这是 file2 啊! "
        ;;
    *)
        echo "这个是其他的东西"
        ;;
esac

(3)for循环

#!/bin/bash
SUM=0
for i in 1 2 3 4 5 6 7 8 9 10
do
    echo "i is $i"
    SUM=`expr $SUM + $i`
    echo "SUM is $SUM"
done
echo "SUM is $SUM"

练习题:从键盘输入目录名,将目录内所有普通文件复制到~/backup文件夹内

分析:①怎么获取目录内的文件

②如果backup不存在怎么办?如果backup存在但是不为空怎么办?

③怎么使用for来赋值文件

#!/bin/bash
if [ ! -d $1 ] #检测你输入的是不是一个目录
then
    echo "你给的不是目录"
    exit
fi
flist=`ls $1` #把你输入目录里的文件存入flist中,作为后期for的查询字典
if [ ! -e $HOME/backup ] #检查是否存在这个文件夹
then
    echo "backup不存在需要创建"
    mkdir $HOME/backup
elif [ `ls $HOME/backup | wc -w` -ne 0 ] #查看这个文件夹内部是否有文件 | 管道符这里是统计文件夹内有多少个文件的
then
    echo "backup不为空需要清理" #清理的过程就是删除原文件夹重新创建一个文件夹
    rm -r $HOME/backup
    mkdir $HOME/backup
    echo "backup清空完毕"
fi
for i in $flist #开始进行循环复制
do
    if [ -f $1/$i ] #表示你输入文件夹内的第i个文件
    then
        cp $1/$i $HOME/backup
        echo "复制文件$!/$i"
    fi
done
echo "复制文件完毕"

(4)while循环

#!/bin/bash
SUM=0
i=0
while [ $i -le 100 ]
do
    SUM=`expr $SUM + $i`
    i=`expr $i + 1`
done
echo "SUM is $SUM"

(5)提前结束循环的语句break和continue

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
    for j in 1 2 3 4 5 6 7 8 9
    do
        if [ $j -gt $i ]
        then
            break
        fi
        SUM=`expr $i \* $j`
        echo -e "$j*$i=$SUM\t\c"
    done
    echo ""
done

          echo -e echo支持转义字符

          \c  不换行

          \t   tab

结束语句块语句fi

if 条件

then 

Linux C语言高级学习第三天(Shell编程)

猜你喜欢

转载自blog.csdn.net/nan_lei/article/details/81121394