Linux4:shell编程(shell的概念,变量,输入输出,运算符,表达式,条件测试,流程控制,数组,函数)

    科技2024-01-03  107

    shell编程(shell的概念,变量,输入输出,运算符,表达式,条件测试,流程控制,数组,函数)

    应用程序----shell命令解释器—内核—硬件

    1.shell的概念: shell是一个解释性脚本语言,脚本就是不需要编译的语言,可以批量次处理命令。

    定义: 解释性脚本语言,批量处理命令使用,类似windows下的.dat文件,属于Linux内核的一个外层保护工具,负责完成用户和内核的交互。

    规则:

    建立shell文件: vim gedit touch … shell文件的后缀名是:.sh shell 是一门语言,有自己的编写规则 运行环境设置:

    第一行 #!/bin/bash //声明shell类型 bash shell 或者 #!/bin/sh

    脚本语句编写: shell命令(if-else)+系统命令(ls cd cp …) 注释行以#开头

    设置可执行性:

    你建立的shell脚本是默认没有执行权限的,需要设置

    chmod +x xx.sh

    解析方式 xx.sh 执行脚本文件:

    ./xx.sh . xx.sh 前提需要有执行权限

    2.关于变量

    shell 里的变量没有类型之分的,直接定义,直接使用。 使用的时候要加:$ 变量定义:

    直接定义 str=hello //等号两端不能有空格 双引号定义 str="hello"//保留特殊字符的含义 单引号定义 str = 'hello' //去除特殊字符的含义

    vim 1.sh

    #!/bin/bash str1="hello" str=hello echo str echo "$str1" echo '$str1'

    chmod 777 1.sh ./1.sh

    运行结果:* 说明:$:引用。放在双引号里面还是引用的作用,放在单引号里面是去除的意思。

    小飘号定义str=`date` 或则 str=$(date) :用来引用系统指令 #!/bin/bash str1="hello" str=hello str2=$(date) echo "$str2" echo str echo "$str1" echo '$str1' ls pwd

    运行结果:

    **变量的引用** 类似于命令的重定向(命令运行结果重定向到变量内) 命令重定向 >输出重定向(覆盖原内容) echo hello >1.txt >>输出重定向(不覆盖原内容,追加) echo world >>1.txt

    变量的分类

    自定义变量 自己定义,自己使用 特殊变量 $0 命令本身 $1 $2 ....$n //取命令行参数 $@//取所有的参数 不包括第0个 $? //判断上一条命令是否执行成功,成功打印0 失败打印非0 $#//传递参数的个数 $$//显示当前的进程号 #!/bin/bash echo "$0" #显示命令本身 echo "$1" #取命令行参数 echo "$2" #取命令行参数 echo "$@" #取所有参数,不包括第0个 echo "$?" #判断上一条命令是否执行成功,成功打印0 echo "$#" #传递参数的个数 echo "$$" #显示当前的进程号

    显示结果:

    环境变量 定义 由系统维护,用于设置系统的shell工作环境,极少数用户可以修改 示例 执行命令的时候,就会去指定的目录(bin、sbin、usr/bin)去寻找是否有这个命令 运行程序的时候去指定的路径(lib、usr/lib)加载库文件 操作 env //显示所有环境变量 HOSTNAME:当前主机名 SHELL:shell类型 QTDIR:qt安装路径 USER:当前用户 PATH:指定当前命令寻找路径 ========================================================== 设置环境变量 export PATH=$PATH:/root //将root路径添加PATH环境变量里面(重启后失效)(设置shell脚本路径) 将这句话加入到开机自启动的文件里面即可永久生效 /root/.bashrc /etc/profile(推荐) /etc/inittab /etc/rcs 修改 export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH(设置动态库路径,这样就不用将动态库复制到/usr/lib里了 LD_LIBRARY_PATH: 动态库的查找路径) 注意 变量都是字符串,没有类型之分,不用声明

    3.输入输出 输入 read num//输入num readonly num=5 //定义只读变量num 输出 echo命令 printf

    参考代码:

    #!/bin/bash echo "qing shu ru shu:\n" read num echo $num readonly n=100 echo $n

    显示结果: 3.运算符&表达式 运算符 算术运算符、逻辑运算符、赋值运算符等

    加减乘除 与或非

    计算表达式的四种方法

    var=$((1+2))

    var=$[1+2]

    let var=1+2

    var=$(expr 1 + 2)

    注意:运算符前后要加空格

    4.条件测试

    语法

    test 条件表达式: test 表达式1 = 表达式2 等号两边须有空格 test string1 = string2

    [条件表达式] [ string1 = string2 ]

    注意 条件表达式值为真返回0,为假返回非0 echo $? 非0为假,0为真 条件表达式两边都要有空格

    判断整数 -gt:大于 test 1 -gt 2 或者简写 1 -gt 2 echo $? 1为假,0为真 -ge:大于等于 -eq:等于 -le:小于等于 -lt:小于 -ne:不等于 判断表达式 -a:两个条件都有满足 ----------and -o:满足一个条件即可 ----------or

    字符串比较 [[ -z $str ]] //长度为0 返回0 [[ $str1 == $str2 ]]//判断是否相等 [[ $str1 != $str2 ]]

    文件条件测试 -f -L -d -e -w -r -x 5.流程控制 if then else if [条件1] then 命令1 elif [条件2] then 命令2 … else 命令n fi

    #!/bin/bash echo "请输入1-7的整数" read num if [ $num == 1 ] then echo "今天星期一" elif [ $num == 2 ] then echo "今天星期二" else echo "输入错误" fi

    case case $变量 in “1”) 命令1 ;; “2”) 命令2 ;; esac

    #!/bin/bash echo "请输入1-7的整数" read num case $num in "1") echo "今天星期一" ;; "2") echo "今天星期二" ;; *) echo "输入错误" ;; esac

    for 形式一 for x in 列表 do 命令 done

    #!/bin/bash for x in 1 2 3 4 5 do echo "hello world" done

    seq 命令:

    `seq 1 10` #执行10

    形式二 for((i=0;i<5;i++)) do 语句 done

    #!/bin/bash for x in `seq 1 10` #小撇号作用:引用系统指令 do echo "hello world" done

    另一种写法:

    #!/bin/bash for((i=0;i<5;i++)) do echo "hello world" done

    while while [循环条件] do 命令 done

    #!/bin/bash echo "请输入整数" read num while [ $num -lt 10 ] do echo "hello" num=$(($num+1)) done

    补充: 退出死循环的方法: 方法一:

    ctrl+c

    方法2:

    ps -ef //查看当前进程 找到进程号 kill -9 30312 //杀死进程

    until until 条件 do 命令 done

    #!/bin/bash echo "请输入整数" //大于10 read num until [$num -lt 10] do echo "hello" num=$(($num-1)) done

    break continue

    #!/bin/bash for ((i=0;i<5;i++)) do echo "hello world" //打印4次 if (($i==3)) then break //continue打印5次 fi done

    6.数组 定义

    定义 1: a=(1 2 3 4 5)下标从 0 开始 各个数据之间用空格隔开 定义 2: a[0]=1;a[1]=2;a[2]=3 定义 3: a=([1]=1 [2]=2)

    引用

    取值: ${a[0]} ${a[@]} //取数组中所有的值 ${#a[@]} //取数组的长度 ${a[@]:2} //截取下标为2及以后的所有元素 ${a[@]:2:2} //截取下标为2及以后的2个元素

    #!/bin/bash a=(1 2 3 4 5 6) echo ${a[0]} //打印1 echo ${a[@]} //1 2 3 4 5 6 echo ${#a[@]} //6 echo ${a[@]:2} // 3 4 5 6 echo ${a[@]:2:2} // 3 4

    7.函数 调用的时候直接写函数名即可 无返回值 无参数 仅仅用来封装代码 function_name() {}

    #!/bin/bash fun() { echo "hello" } fun

    8.shell编程的应用: 8.1,查找当前路径下的所有.c文件:

    #!/bin/bash #简化版的查找.c文件的shell脚本 #寻找.c文件的函数(function ) findcfile() { #找到以.c结尾的文件,文件名列表存放在变量cfilelist里边 cfilelist=$(ls | grep '.c$') #通过for循环显示文件路径以及文件名 for cfilename in $cfilelist do echo $(pwd)/$cfilename done } #调用函数实现查找 echo "当前路径下的.c文件有:" findcfile

    即可查找出当前路径下所有的.c文件。

    8.2,查找当前路径及文件夹下所有的.c文件。

    #!/bin/bash #完整版的查找.c文件的shell脚本,可以进入文件夹 #判断通过参数传递的文件夹是否存在,是否为空 if [[ -z $1 ]] || [[ ! -e $1 ]] then #如果没有传递文件夹,就在当前目录下寻找 echo "The directory is empty or not exist!" echo "It will use the current directory." newdir=$(pwd) //引用当前路径给变量 echo "当前所在路径是:" echo $newdir echo "这个路径下.c文件有:" else #如果传递的有文件夹,进入传递的文件夹,开始寻找 cd $1 newdir=$(pwd) echo "当前所在路径是:" echo $newdir echo "这个路径下.c文件有:" fi #递归寻找.c文件的函数 findcfile() { #找到以.c结尾的文件,文件名列表放存在变量cfilelist里边 cfilelist=$(ls | grep '.c$') #通过for循环显示文件路径以及文件名 for cfilename in $cfilelist do echo $(pwd)/$cfilename done #遍历该目录,当判断其为目录的时候,进入目录,调用该函数,实现递归 dirlist=$(ls) for dirname in $dirlist do if [ -d $dirname ] then cd $dirname findcfile cd .. //返回上层目录 fi done } #调用递归函数实现查找 findcfile

    即可打印出所有的.c文件。

    参考结构流程图: shell编程 注:需要使用xmind软件进行查看

    Processed: 0.013, SQL: 8