网站建设互联网推广,wordpress 资料图片,建设淘宝网站的人员组织结构,深圳企业网站制作制作这个周末#xff0c;为了某些原因#xff0c;我把shell编程的一些基础知识进行了相应的整理#xff0c;这里分享给大家#xff0c;大家在看的时候#xff0c;有什么问题可以在下方评论区给我留言呀#xff0c;欢迎转发自己纯手打#xff0c;原创不易#xff0c;谢谢支持…这个周末为了某些原因我把shell编程的一些基础知识进行了相应的整理这里分享给大家大家在看的时候有什么问题可以在下方评论区给我留言呀欢迎转发自己纯手打原创不易谢谢支持*基础引入*执行sh01.sh*文件流和重定向*文件流我们大家应该对一个东西不陌生编程那编程这个东西简化一下应该怎么分步骤呢赵本山老师说过是不是大象关进冰箱分几步 啊三步是不是打开冰箱大象放进去关上冰箱那好其实我们的编程也就是这样无非就是一个input一个output中间的实现过程是不是就可以按照你的习惯自己去书写了啊对吧所以文件流或者说IO流其实就是这样的一个概念那好我们为什么要在linux中强调这个东西你们之前学过linux那你们应该知道linux区别于windows 的一个点是不是就是文件至上 啊在linux的认知中的一切皆文件可能你们用的是图形化界面的linux那大家可以看一下老师的这一个是不是里面所有的东西都是文件啊就是以文件的形式存在的。重定向(重定向不是命令)程序自身都有IO0标准输入1标准输出2错误输出输出重定向控制程序IO位置本身我们的文件是不是一对一的一一对应一个输入就是完整的输入到一个输出中啊然后呢我们linux干了一件什么事 啊他找了一个第三者(fd)中间人的意思啊然后呢我们的输入连接到第三者,然后由第三者将数据进行相应的转发转发到我们想要他去的位置cd /prof/$$/fdPs -ef 查看进程 ps -ef | grep 13175举个例子ls这个命令大家都很熟悉了对吧我反正拿到一个linux系统就跟拿到数据库管他怎么样先来一个select一样我就先来一个ls然后再去做别的那好那我们知道ls是不是就是输出显示啊ll命令就是ls -l的缩写那他是将当前目录的内容展现到控制台也就是我们的页面上进行相应的显示对不对那好我们前面也说过012这三个属性对吧对应输出的是不是就是我们的1啊那我们可不可以通过1这个属性将我们的这个输出位置进行相应的改变啊好我们来看一下ls 1 aaa 在这其中有两个点一个是覆盖(ls /tmp 1 aaa)一个是追加(ls /tmp 1aaa)那如果我们换一下呢 ls / /tmp 1 aaa 这个命令是不是这两个文件夹中的目录都进入我的aaa中了啊那他的顺序是怎么样的啊那好这个地方分成两种情况讨论一同级(按照字典序排列)而上下级(按照上下级排列也就是我们的目录深度为什么因为我们的linux是不是一个目录树的结构 啊 tree -L n)组合使用新建 mkdir outls / /aabb 1ls01.out 2ls02.out(aabb不存在)那这样写是不是很麻烦啊可以不可以联系结合到一起啊ls / /aabb 1ls03.out 2ls03.out按照常理来说是不是从左向右执行对吧但是这里为什么没有我们的错误输出呢好我们来看一下ls / /aabb 或者ls /aabb /我们发现无论怎么处理是不是最先输出的是我们的错误日志啊那也就是说我的命令ls / /aabb 1ls03.out 2ls03.out先将错误日志写入到ls03.out中啊然后当我们再次写入标准输出的时候会被覆盖掉啊ls / /aabb 1ls04.out 2ls04.out这样是不是还是很麻烦啊人比较懒我不想重写两遍那我该怎么处理呢这里就有一个新的符号ls / /aabb 21 1ls05.out这里有问题啊是不是啪啪打脸 啊我说这里可以用一个符号但是为什么会有问题啊大家想一下这条命令我是不是按照顺序进行是不是有一个2一个1 啊那2指向1了但是1是不是指向控制台啊也就是说我的错误日志是不是还是在控制台上进行展示啊然后这个进行完了之后1又重新指向了ls05.out,那我们这地方考虑一下换个顺序怎么样ls / /aabb 1ls06.out 21这样是不是就可以了啊。但是啊这里注意啊(符号左边不能有空格但是右边没问题是可以的)ls / /aabb ls07.out 和ls / /aabb ls07.out这是两个特殊写法 是最简单的特殊写法记住就可以了)输入重定向之前我们写的都是输出重定向然后接下来就是我们的输入重定向read aaa hello worldread aaacat 0*shell变量*exec ls---展示当前目录并退出exec 8 /dev/tcp/www.baidu.com/80[rootlinuxStudy fd]# echo -e GET / HTTP/1.0 18[rootlinuxStudy fd]# cat 0注意点我们刚才是不是echo发送了一个数据啊但是我们再次cat的时候他不会发送消息了为什么因为我们用的是http1.0的版本它是一个只会发送一次请求的短连接我们如果要再次获取数据的话需要再次重新定义那我们创建了这么多的链接我们该如何删除啊可以rm -rf吗不行我们只能exit退出没办法他就是这么任性变量那好我们现在要来定义变量本地当前shell拥有生命周期随shell进行改变假设我们定义一个变量aaabaweiEcho $aaa 是不是可以展现啊但是如果我重新开一个链接是不是就不行了啊如果是创建本地函数呢同样的clearqwe没有输出值为啥 啊是不是我们就没有给他赋值 啊然后呢qwe123我给他赋值然后我们在使用bawei看一下是不是就有了 啊局部这一个我们的区别就是我们直接bawei可以取得bbb的值但是我们直接echo $bbb,就不能获取我们的值位置但是Vi sh03.shSource sh03.sh a b c d e f g h 执行的话没有办法执行啊怎么办呢这个地方当发生重复的时候我们可以将其括起来echo ${12}AbchelloEcho $abcverygood(不行)echo ${abc}verygoodawk -F {print $1} passwd这个地方的注意点就是这个{}需不需要单引号当我们要将其传给bash的话不需要单引号传给命令的话需要单引号再说一个简单的例子----数组[rootlinuxStudy sh]# msb(1,2,3)[rootlinuxStudy sh]# echo $msb1,2,3[rootlinuxStudy sh]# echo ${msb[1]}[rootlinuxStudy sh]# echo $msb[1]1,2,3[1]我们除了可以读取整个数组之外是不是无法根据下标来进行读取啊那这个地方怎么办啊这里就涉及到一个东西就到分隔符我们看一下刚才我们定义的数组是不是通过逗号进行分割的啊但是linux中他对于分隔符比较敏感的是不是空格啊那我们用空格尝试一下[rootlinuxStudy sh]# msb(1 2 3)[rootlinuxStudy sh]# echo ${msb[1]}2特殊$BASHPID执行source sh03.sh a b c d e f g h i j k l m n$* 与 $ 区别·相同点都是引用所有参数。··不同点只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3则 * 等价于 1 2 3(传递了一个参数)而 等价于 1 2 3(传递了三个参数)。·注意点管道[rootlinuxStudy sh]# a9[rootlinuxStudy sh]# a22 | echo grepgrep[rootlinuxStudy sh]# echo $a9为什么呢我们不是设置了a22 啊为什么还是现实为9 啊这就是管道 的一个原理管道就是把左边命令的输出作为右边命令的输入这是他最基础的认知 那这边我们的bash和管道是干嘛了呢他是在左边和右边各启动一个bash当左边的bash执行完毕后是不是去执行右边的bash 啊 但是我们说了变量的值是不是执行当前的shell的生命周期啊对吧那这样的话当这个bash结束之后是不是他的生命周期就结束了 啊那他跟我们外面的这个bash有影响吗没有的那这个地方有什么用处呢这个就是我们的环境变量的问题环境我们之前用过jdk吧那我们知道jdk配置完成之后要在环境变量中定义那这个地方就涉及到一个问题就是bash是如何创建的bash在管道中的创建子bash会继承父bash的值但是在其他里面就不可以了但是在其他的里面呢这里是不是就看出来了在管道中是不是无论是否export我的数值都是可以调用的啊因为他直接继承父bash的值但是呢当我们将其写入到文件中的时候如果没有export是不是没有办法找到 啊因为他无法继承父bash而且这里是不能跨bash进行继承例如我们在创建一个连接就无法调用我这个bash的值*逻辑判断*我们刚才讲过一个export那好这里再讲解一下[rootlinuxStudy sh]# vi sh05.sh[rootlinuxStudy sh]# chmod x sh05.sh[rootlinuxStudy sh]# lsa.out passwd sh01.sh sh02.sh sh04.sh sh05.sh[rootlinuxStudy sh]# ./sh05.sh.............99[rootlinuxStudy sh]# a88[rootlinuxStudy sh]# ./sh05.sh.............99[rootlinuxStudy sh]# export a[rootlinuxStudy sh]# ./sh05.sh88.............99export的一个特性叫做导出非共享[rootlinuxStudy sh]# echo $a88fork():创建子进程一个是管道(创建子进程完整复制了父进程的值可以直接访问)一个是文件(需要export如果不export的话无法获取父的值)Copy on Write引用和命令替换单引号强制引用双引号弱引用不会产生覆盖[rootlinuxStudy sh]# a99[rootlinuxStudy sh]# echo $a99[rootlinuxStudy sh]# echo $a$a花括号扩展不会被引用[rootlinuxStudy sh]# cp /etc/inittab /etc/passwd ./cp是否覆盖./passwd y[rootlinuxStudy sh]# cp /etc/{inittab,passwd} ./cp是否覆盖./inittab ycp是否覆盖./passwd y[rootlinuxStudy sh]# cp /etc/{inittab,passwd} ./cp: 无法获取/etc/{inittab,passwd} 的文件状态(stat): 没有那个文件或目录为什么呢因为{}外如果添加引用符号他会默认的将引号之中的路径当做一个文件这是肯定不行的Bash执行前删除引用以及反向引用退出状态和逻辑判断退出状态就是我之前写的echo $?逻辑判断 (一假全假)||(一真全真 )*表达式*Let命令算术表达式主要使用Let c$a$b和C$(($a $b))(注可以不加$)条件表达式Test简化的条件表达式[]*接下来我们要开始书写shell脚本*1、2、判断是否有参数[ ! $# -eq 1 ] echo args error!!! exit 23、判断用户是否存在id $1 /dev/null echo user exist exit 3为什么啊。因为id这个命令大家可以看一下 id 用户名 可以进行相应的查看4、#! /bin/bash[ ! $# -eq 1 ] echo args error!!! exit 2id $1 /dev/null echo user exist exit 3useradd $1 /dev/null echo $1 | passwd --stdin $1 /dev/null echo user add success exit 4echo i dont know ,user add fail exit 5*流程控制*IfHelp if.查看帮助文档If test 3 -gt 2; then echo ok ;fiIf test 3 -gt 2;then echo ok;else echo error ;fiIf test 3 -eq 4;then echo ok;elif test 3 -eq 3 ;then echo 3;fiWhileWhile ls /share;doecho ok;rm -rf /share;done注while后面必须跟一个命令For那说起for来我们大家应该都不陌生它有两种不同的方案是不是普通的for循环和增强for循环啊For((a1;a5;a));do echo $a;doneFor i in 1 2 3 4 5 ;do echo $i;((i));done这里面补充一个简单的seq n它就是打开一个n个数列的循环相应的内容我已经整理成文档有需要的文档可以私信“资料”查看获取方式