shell知识点

    静态语言是编译型语言,强类型的语言 如C,C++,java(面向对象),C#,

   动态语言是解释型语言,弱类型的语言,边解释边执行 ,需要解释器,解释器是用静态语言开发的如shell(面向过程),                           perl,asp,asp.net,php,python(面向对象)

脚本执行

   1.赋予权限,直接执行   ./teset.sh  

     2.通过bash执行,bash   test.sh   不需要执行权限       

    脚本执行时会自动启动一个子shell,命令行中启动的脚本会继承当前shell环境变量(命令行中启动)

    系统自动执行的脚本无法继承shell环境变量(非命令行中启动)

脚本调试

-n:   不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示。

-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
-x:将执行的脚本内容及输出显示到屏幕上,这个是对调试很有用的参数

set命令可辅助脚本调试。以下是set命令常用的调试选项:
set -n 读命令但并不执行。

set-v显示读取的所有行。
set-x 显示所有命令及其参数。

提示:  1)同bash命令参数功能。
         2)开启调试功能通过set -x命令,而关闭调试功能通过set +x。

            优点:和bash-x相比,set -x可以缩小调试的作用域

脚本命令

命令替换

反引号和$()基本几乎等价,但尽量使用$()

命令替换分为两个过程:(1)开启子shell执行其中的命令(2)将子shell中的输出结果打包插入在命令行中。但打包输出结果的过程是可以控制的(例如使用双引号)。

反引号有两点不方便之处:

(1)命令替换嵌套或者是包含引号的时候,反引号很麻烦,不如$()易读。使用$()可以让括号里的命令提前于整个命令运行,然后将执行结果插入在命令替换符号处。由于命令替换的结果经常交给外部命令,不应该让结果有换行的行为,所以默认将所有的换行符替换为了空格(实际上所有的空白符都被压缩成了单个空格)

(2)反引号处理反斜线的转义规则比较不明确,但是$()中的反斜线会按正常的方式转义

使用$()可以让括号里的命令提前于整个命令运行,然后将执行结果插入在命令替换符号处。由于命令替换的结果#经常交给外部命令,不应该让结果有换行的行为,所以默认将所有的换行符替换为了空格(实际上所有的空白符都#被压缩成了单个空格)。
[root@wwyt ~]# echo -e "a\nb"
a
b
[root@wwyt ~]# echo `echo -e "a\nb\t   \tc"`
a b c

var="`echo -e "a b\n1 2"`"   # 命令替换加双引号保护
echo "$var"   # 变量引用也加双引号保护

管道

其本质是数据传递,管道左边的输出数据放入内存,由管道右边的进程读取。假如内存不足以完全存放输出数据,则管道左边的进程将一直等待,直到管道右边取出内存中一部分的数据以让管道左边的进程继续输出,而管道右边的进程在管道左边的进程启动后也立刻启动了,但是它一直处于等待状态,等待接收管道传递来的数据。管道左右两边的进程运行几乎是没有先后顺序的。

在使用匿名管道的过程中,可能已经发现管道两边的进程是同属一个进程组的,也就是说管道左方的数据只能传递给管道右方的进程,其他任何进程都没法读取此数据。但除了匿名管道,还有命名管道,命名管道是将一个进程的数据存储到一个管道文件(fifo)中,其他进程可以读取该管道文件来读取其中的数据,也就是说不再限制数据读取方

重定向

标准输入 = /dev/stdin   = 代号0 = <符号(注意,没有包含<<符号)。
标准输出 = /dev/stdout = 代号1 = >或>>符号。
标准错误输出 = /dev/stderr = 代号2 = 使用2>或2>>符号。

上面的/dev/std{in,out,err}分别是0、1、2默认的输出目标,当重定向后,就不再使用这些目标,它们分别是各个终端字符设备的软链接,如果要打开其他文件,则文件描述符必须从3开始标识。对于我们人为要打开的描述符,建议使用9以内的描述符,超过9的描述符可能已经被系统内部分配给其他进程。

文件描述符的复制表示复制文件描述符到另一个文件描述符中以作其副本。使用"&"进行复制

<、>、2>实现的是覆盖功能,>>、2>>实现的是追加的功能,但是注意"<<"不是追加功能,而是表示此处生成文档(here document),在后面cat和重定向配合的内容里有说明。此外,还有<<<,它表示此处字符串(here string),也见下文。

有时候,使用"-"也表示/dev/stdin

在有输出类的重定向(包括错误重定向)语句中,命令执行之前就已经将文件截断为0大小

有些时候直接使用">"覆盖输出是比较危险的。可以使用set -C来设置如果输出重定向文件已经存在则不覆盖。使用set +C来取消set -C的效果。如果在设置了set -C时仍然想强制覆盖,可以使用“>|”代替“>”来重定向输出。同理错误输出也有此特性

(1).重定向操作是shell最先解析到的,在执行命令之前,重定向就会先打开文件以确定输入、输出的位置。如果是重定向输出操作,则先截断文件使其为空。

(2)./dev/stdin、/dev/stdout、/dev/stderr等设备只是数据默认的流向目标(严格地说是文件描述符0、1、2的输出目标),它们不等价于"标准输入0、标准输出1、标准错误2"。之所以称为"重定向",就是将数据的流向改变,不再输入到这些默认设备中。

(3).重定向的顺序很重要

eof部分都必须使用"<它表示here document,此后输入的内容都作为一个document输入给cat。既然是document,那就肯定有document结束符标记document到此结束,结束符使用的是here document后的字符。

在bash中,<<和<<<是特殊重定向符号。<<表示的是here document,<<<表示的是here string。

对于here string,表示将<<<后的字符串作为输入数据

[n]<> filename :打开filename,并指定其文件描述符为n,该描述符是可读、可写的描述符。若不指定n则默认为0,若filename文件不存在,则先创建filename文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤舞飘伶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值