博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux Shell编程
阅读量:6590 次
发布时间:2019-06-24

本文共 2816 字,大约阅读时间需要 9 分钟。

在linux系统中,我们一般都是用C语言写服务端程序,但是一般我们不直接启动这个程序,而是通过一个shell脚本启动和关闭(需要设置一些环境变量和防止打开多个改程序,打开多个后需要找到pid才能关闭)

 

那么shell是什么呢?

说白了shell是操作系统提供给我们的一种语言,用来将用户的命令输送到内核中执行

 

shell编程

1首先我新建一个test2.sh,存放下面的一段shell代码

2保存后,修改这个shell为可执行文件 chmod +x test2.sh

#! /bin/sh#定义变量name=张三echo $nameecho "参数:$*"echo "参数个数$#"

输出结果:

下面分别介绍字段的含义

第一行一般默认第一行都是上面这段#! /bin/sh,通知系统用/bin/sh来执行下面的程序。

以“#”开头的行代表注释

echo代表输出后面一段话的到用户界面

$name代表使用了name这个变量(定义shell变量在下面介绍)

$* 代表所有的参数(我们在shell命令后面加了hello 和world两个参数)

$#代表参数的个数

 

有了初步的认识,我们就开始踏入shell编程吧!

1shell变量

定义shell变量:(注意等号左边右边不可以有空格)

shellname=value

使用shell变量

$shellname


2$数字

代表第几个参数

例如$1代表第一个参数,按照上面的代码就是hello

还有下面的一些$符号的使用。

可能会对$?有一点费解,例如我们在shell中调用了一个C语言程序mydemo,其中mydemo这个主函数会返回100(这里不写c代码了)

#! /bin/sh./mydemoecho $?

shell输出值:100

也可以是执行一段shell函数,获取该函数的返回值(最后讲函数说到)


3shell中执行命令

如果我们想在shell中执行一段命令,并将该命令的值存放到一个变量中,就要用到` `符号(在1数字旁边)

#! /bin/shresult=`ls`echo result=$result

ls命令显示当前文件夹下有哪些文件

输出结果:result=test.sh ...


4读取键盘

我们在运行shell的时候,可能需要我们输入一些数据,除了带参数的方式我们还可以使用read进行读

#! /bin/shecho "please enter a"read aecho "please enter b"read becho "a=$a,b=$b"

输出结果:

read命令读取一个输入行,直至遇到换行符。

行尾的换行符在读入时将被转换成一个空字符

如果read命令后有变量名,输入内容赋给该变量。

如果read命令后未跟变量名,读入的行将被赋值给内置变量REPLY。


 shell也会像高级语言支持if,while等计算

if语句(两种)

(一)第一种if(用来判断条件是否正确)

格式:(fi代表这个if结束)

if (test condition) then  commandselse  commandsfi
test是一个固定关键字,用来判断condition的描述是否正确
#! /bin/shif (test "start" =  "${1}" ) then        echo "start"else        echo "end"fi
执行结果:

(二)第二种if(用来判断文件或者文件夹是否存在)

格式:

if [ -option file]; then  commandselse  commandsfi

代码:

#! /bin/shif [ -d "${1}" ]; then        echo existelse        echo notexistfi

运行

查看dir1文件夹是否存在,因为我创建了一个,所以是存在的。

其中还有一些其他选项


while循环

代码格式:([右边和]左边都要有一个空格哦,done代表循环结束,当条件不成立时候循环结束)

while [ expr ];do  commandsdone

代码demo(大家可以自己验证哈)

#! /bin/shtmp=0while [ "$tmp" != "5" ];do        echo "curtmp=$tmp"        tmp=$[ $tmp + 1 ]done

 


case分支语句

同样也支持像switch那样的分支选择语句的

代码格式:(如果有一个pattern匹配到跟string内容一样,执行这里面的内容,否则执行最下面的*分支,;;两个分号代表退出case循环,跟C语言的break)

case "string" inpattern_1)  commands;;pattern_2)  commands;;*)  commands;;esac

for循环

代码格式:(会遍历这个list数组,将当前值存放到varname变量中,后面的分号也是必不可少的哦

for varname in list ;do  commandsdone
代码demo
#! /bin/shfor name in $*;do        echo "$name"done
上面的代码会输出所有的参数。

exit语句

跟C语言的exit很类似,代表退出当前shell
代码格式:(code代表退出码)
exit code
可以在一个Ashell中调用另一个Bshell,可以在Ashell通过$?得到Bshellexit退出吗

函数

shell同样也是支持函数的哈
代码格式:(使用前必须先定义函数)
function funcname{  commands}
代码demo:
#! /bin/shfunction fun1{        echo "第一个参数:$1"        echo "第二个参数: $2"        return 100}fun1 3 4echo "函数返回值:$?"
上面代码输出什么大家应该知道了。可以再验证一下

总结demo

 最后写一个demo,代表打开某个进程(如果已经打开就不再重复打开)
#! /bin/shme=`whoami`PID=`ps -u $me |grep mydemo|awk {
'print $1'}`if( test "$PID" = "" ) then `mydemo`fi
PID的变量用来获取mydemo的pid值
grep代表搜索mydemo这个进程
awd标识输出这一行的第一列,也就是pid的值
大家可以了解一下ps,grep,awk命令哈

 

转载于:https://www.cnblogs.com/nfcm/p/7743418.html

你可能感兴趣的文章
_鼠标移动跟随效果
查看>>
韩梦飞沙Android应用集合 想法
查看>>
python socket 接口
查看>>
Pwn2Own黑客大赛战况:iPhone 20秒被黑
查看>>
ASP开发基础
查看>>
mongodb远程连接访问
查看>>
【转】ret,retf,iret的区别
查看>>
XML 在SQLServer中的使用
查看>>
Linux 学习笔记 (四)Ubuntu14.04 解决上网问题安装无线网卡驱动
查看>>
MYSQL性能调优
查看>>
1003 我要通过!(20)(20 分)
查看>>
LVM自动扩容
查看>>
笔记整理4
查看>>
html进阶css(5)
查看>>
分析文件上传过程中的HTTP头部
查看>>
森林病虫防治系统 (二.1)
查看>>
延时执行和取消延时执行
查看>>
\045在字符串中输出为%
查看>>
在eclipse中如何搭建ssh框架
查看>>
idea文件折叠显示出来配置
查看>>