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