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

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软件进行查看

猜你喜欢

转载自blog.csdn.net/weixin_40734514/article/details/108947860