shell脚本-随笔(引号;分号;重定向)
⼀,关于定义常量时,引号的使⽤
1. 单引号
使⽤单引号的情况下,不管⾥⾯的是否有变量或者其他的表达是都是原样⼦输出
2. 双引号
如果其定义变量的时候使⽤双引号的话,则⾥⾯的变量或者函数会通过解析,解析完成后再输出内容,⽽不是把双引号中的变量名以及命令原样⼦输出。
3. 不使⽤引号
⽤于⼀些简单字符数字的定义与双引号类似
使
⽤
规
则
解释
单
引
号
所见即所得,即输出时会将单引号内的所有內容都原样输出,或者描述为单引号⾥⾯看到的是什么就会输出什么,这称为强引⽤
双
引号(默认)输出双引号内的所有内容;如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,推荐使⽤,这称为弱引⽤
⽆引号赋值时,如果变量内容中有空格,则会造成赋值不完整。⽽在输出内容时,会将含有空格的字符串视为⼀个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然
后输出最终内容;如果字符串中带有空格等特殊字符,则有可能⽆法完整地输出,因此需要双引号替代⽆引号的情况,特别是对变量赋值时改加双引号。⼀般连续的字符串、数字、路径等可以不加任何引号进⾏赋值和输输出,不过最好是⽤⽤
反
引
号
⼀般⽤于引⽤命令,执⾏的时候命令会被执⾏,相当于S0,赋值和输出都要⽤“将命令引起来
⼆,关于分号
在Linux bash shell中,语句中的分号⼀般⽤作代码块标识
1、单⾏语句⼀般要⽤到分号来区分代码块
注意:语句结尾不要分号。
2、该代码若写作多⾏,⽤换⾏符来区分代码块,则⽆需⽤到分号
三,关于重定向输出和⽇志
关于重定向,最近踩了⼏个坑,mark⼀下。
1、⾸先认识,0 stdin,1 stdout,2 stderr,> 新建/覆盖⽂件, >> 追加⽂件
常见的计划任务,例如:
*/2 * * * * sh /opt/xxxx/test_S1.sh >/ 2>&1
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
对于&1, 更准确的说应该是⽂件描述符 1,⽽1标识标准输出,stdout。
对于2 ,表⽰标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这⾥标准输出已经重定向到了 /。那么标准错误也会输出到/
偶尔也可以把 & 在命令的最后加上,表⽰让程序后台执⾏。
有时候希望将错误的信息重新定向到输出,就是将2的结果重定向⾄1中就有了”2>1”这样的思路,如果按照上⾯的写法,系统会默认将错误的信息(STDERR)2重定向到⼀个名字为1的⽂件中,⽽⾮所想的(STDOUT)中。因此需要加&进⾏区分。就有了 2>&1 这样的⽤法
⼩结:
ls 2>1测试,不会报没有2⽂件的错误,但会输出⼀个空的⽂件1;(1代表⼀个⽂件,这⾥如果⽤>>1,则为追加1,不会覆盖1)
ls xxx 2>1测试,没有xxx这个⽂件的错误输出到了1中;(1代表⼀个⽂件)
ls xxx 2>&1测试,不会⽣成1这个⽂件了,不过错误跑到标准输出了;(1代表stdout)
ls xxx & 2>&1, 实际上可换成 ls xxx 1& 2>&1;重定向符号>默认是1,错误和输出都传到了。(类似于IO⾥,先打开输出流1,再给输出1传⼊数据2)
2、ls xxx 2>&1 | tee -
这个⽤法把 2>&1 放在前⾯,关键在于⽤了管道符,把1作为下⼀个输⼊传⼊。
| 管道
管道的作⽤是提供⼀个通道,将上⼀个程序的标准输出重定向到下⼀个程序作为下⼀个程序的标准输⼊。
通常使⽤管道的好处是⼀⽅⾯形式上简单,另⼀⽅⾯其执⾏效率要远⾼于使⽤临时⽂件。
这⾥使⽤管道的⽬的是将make程序的输出重定向到下⼀个程序,其最终⽬的是⽤来将输出log存⼊⽂件中。
shell脚本返回执行结果tee是⽤来⼲什么的?
tee从标准输⼊中读取,并将读⼊的内容写到标准输出以及⽂件中。
所以这⾥tee命令的作⽤是将数据读⼊并写到标准输出以及中。
遇到的问题:
#!/bin/bash
sh abc.sh 2>&1 | tee -
if [ $? -ne 0 ]
then
echo "failed"
else
echo "successed"
fi
最初设想是收集执⾏ abc.sh 时的错误⽇志屏幕输出并记录到 中。但因为管道符 if 语句判断的 $? 始终为 0 。因为返回值是 tee 这句的执⾏返回。所以为了保证 $? 准确性,只好牺牲屏幕输出,改为
#!/bin/bash
sh abc.sh >> 2>&1 if [ $? -ne 0 ]
then
echo "failed"
else
echo "successed"
fi
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论