shell中可以对部分内容,改变显示。比如对一部分内容以红色标出,醒目。通过echo -e
输出。但是有一个问题是echo不接收文件参数,可以使用xargs
来转化,同时如果内容很长很多换行,直接将这些乱七八糟的信息传给echo也会造成意想不到的输出内容。
一个方法是使用while一行一行的输出,如下所示,patchset.info中存放我我想输出的内容,多行。
值得注意的是sed使用的是单引号。即关闭所有的变量转化等,反斜杠也是具有转义效果的,`xargs`似乎也有转移效果最终,就多了这么多反邪杠
shell颜色效果
pwd
可以显示当前路径,$PWD
变量同样显示当前路径
type
命令可以查看命令的类型,由谁提供
mv
: move,ls
: list, ps
: process status, sed
: stream editor, CR : a carriage return, LF a linefeed
source
执行shell程序,也可以用(dot)即.
,和shell文件正常的执行的区别是,正常的执行系统会自动fork一个新的shell去执行程序文件中的shell。这样改变环境变量之类的操作就不会作用与当前的终端上。而source则用当前终端去执行等同于直接在终端敲命令,这样对环境变量的更改就会作用与当前终端。经典的例子是android,在编译之前会把build目录下的env脚本source一下,就是这个目的。
shell中有无数特殊变量,以下为含义
应该多用printf取代echo,echo存在一定的兼容性风险。
shell文件头,一些常用注释,签名
shell中重定向,可以使用&> FILE
和&>> FILE
将标准输出和错误输出都导向到一个文件中
输出随机数${RANDOM}
保持子shell的输出
使用printf保存变量
在shell的参数中以空格换行作为分割符,单引号和双引号都可以将空格包含在一个参数内,其中双引号支持换行,单引号内不能包含单引号,单引号内都被当作直接的字符,但是$''
则可以包含转义的单引号和字符。
花括号参数,不是标准的参数形式,但支持一些特殊的功能
shell参数支持~
主要是用户目录。
shell参数支持数学计算,使用$(( expression ))
使用$( )
实现内部执行命令
变量同样应该再两边加引号,不然有空格回车就会被分割
IFS
:internal field separator variable.默认情况下IFS= \t\n
.只对变量有效,其作用就是用来对变量在做参数时根据分割符自动分割。
shell的参数若不加引号,并且使用通配符,则会自动匹配目录下的文件
将命令的输出作为输入<()
计算字符串长度
shell中我们可以是使用getopt管理命令行参数,使用shift管理位置参数。参数的特殊shell变量OPTIND
OPTARG
|
和()
都会进入子shell执行,而子shell的变量是不会传给父shell的。所以这里要留心。
read和IFS有个特殊写法,就是直接在行首定义IFS,然后这个变量只作用与当前行.
设置变量默认值.${var:-default}
当字符为空或未设置设置默认值。 ${var-default}
只当未设置设置默认值。 ${var:+alternate}
只当字符设置,设置为默认值 ${var+alternate}
当字符设置或者为空,设置默认值.
第一个字符为空,所以就不会加空格。
${var:?message}
,如果未设置值,报错。${var:=default}
与${var:-default}
类似。但会输出
${#var}
显示变量长度。
${var%PATTERN}
去除结尾匹配的字符。shell真变态,搞这么多变量的语法。。。。。 ${var%%PATTERN}
去掉结尾匹配最长的串.${var#PATRERN}
去掉开始匹配的最短串,${var##PATRERN}
去掉开始匹配的最长串
取出参数中的目录
${var//PATTERN/STRING}
替换所有符合规则的字串
${var:OFFSET:LENGTH}
返回指定长度的子串
${!var}
直接返回字符内容对应的变量的内容
${var^}
${var^^}
返回大写内容,第一个只转化部分,第二个全部,同样可以返回小写${var,}
${var,,}
遍历所有参数,执行shell
数组的使用 ,使用括号可以快速初始化,使用井号可以查看对于个数,使用+=
可以合并其他数组
字符数组
解析ip地址
shell的函数,内容体可以是()
{}
for case until while
等任意一个具有作用域的关键词,但是其效果肯定是有不同的,比如()
必然只能作用与子进程,修改不会影响当前进程
set --
替换参数,可以配合IFS实现灵活的替换。
遍历变量字符串中的字符,相当的hack啊,,真心无语
shell字符串去空格trim
shell的index 函数
bash 读取文件
?(pattern-list)
0个或者1个匹配实例。*(pattern-list)
0个或者多个匹配。 @(pattern-list)
单个匹配 。+(pattern-list)
多个匹配。!(pattern-list)
不匹配的。
递归显示
time 重定向问题。time不会被重定向是因为他是bash的内置命令。要想重定向需要使用括号,括起来。
eval
进行执行结果的结果
搜索命令执行的路径
注意,判断条件中对变量进行判断,一定要用引号引起来。否则它不会将变量当作字符串
用bash -n COMMAND
可以先测试一下命令的语法,结构等,这样可以提前解决一些问题。 然后再shell里面重定向输出不能有空格>&2
.使用 set -x
可以打开命令的回显,更方便调用.设置PS4可以调整打印命令的内容,比如显示执行命令的行数export PS4='+ $LINENO: '
.set -u
将unboud value 当成是错误。这样很多问题更容易暴露
目录管理,常用的目录控制命令是cd
,并且cd -
可以返回上一次的目录,更强大的目录管理是pushd
,popd
使用堆栈管理目录,保存与变量DIRSTACK
目录管理中,使用内置命令dirs -l -p
可以显示DIRSTACK中的目录扩展特殊字符并且按行显示。
eval "${!num#*:}"
这句确实厉害,执行一个变量内容的内容的命令
ctrl + L
清屏幕,等同与clear
less
增强的结果显示,可以前进后退
shell的配置文件最好能被直接source
,这样设置的变量就可以直接运行到环境中来,即配置直接写成shell代码
shell中array可以在中途reset掉,遍历的方法是使用${array[@]}
.使用${!array[@]}
可以遍历index.
bash 读取文件mapfile -t array < "$kjv"
或者 array=( < "$kjv")
pro bash 最后几章讲解了shell中的图形操作,键盘交互,暂时用不到我就一略而过。但若是想要使用shell编写高交互的东西,可以去参考一下。
shell 可以操作命令列表 history -c
清空历史.history -s
保存命令。
一些变量
shell的方法返回值可以用return,if语句会直接取return值作判断。但是若是想对return值取反,可行的办法可能还是只有用test命令,只能再对$?
进行判断,判断[ $? != 0 ]
.另一种可行的办法就是使用$()
,取输出的结果。当然在方法中就不使用return了,全都默认为成功。用echo输出成功失败,也就是y或者n,然后再用test去判断。