管道
shell 中一个命令的输出交给另一个命令处理,它们之间联系就是通过管道传输的,方法很简单,就是在它们之间加一个 “|” 即可。
isstack@isstack-virtual-machine:~$ ps aux | grep httpd
isstack 3489 0.0 0.0 13620 940 pts/1 S+ 15:58 0:00 grep --color=auto httpd
将ps 的输出交给 grep过滤。
- 重定向
重定向输入: < ,从指定文件读取数据
重定向输出: >、>> ,将输出结果覆盖、添加到指定文件。(单个> 代表覆盖)。
标准错误输出:2>、2>> ,将错误信息覆盖、添加到指定文件。(shell 命令执行的结果可能会有错误发生,这些错误信息用2 来区别于正确输出)
混合输出:&>、&>>,将标准出书和错误信息一起覆盖、添加到指定文件。
添加和覆盖的区别在于用一个还是两个> 符号。
isstack@isstack-virtual-machine:~$ find arm > mess.txt
这个目录下有许多含arm 的文件,但是屏幕上不会任何输出,因为输出被重定向到mess.txt 中去了。其他重定向的命令基本差不多。
- 命令间逻辑
逻辑与:&&
逻辑或:||
分隔命令: ;
这可以让命令之间根据逻辑关系来执行,&& 让它们先执行前面的命令,如果前面的命令执行成功会继续执行后面的命令,如果失败则不会再执行后面的命令。
- 变量基础
变量定义直接:
变量名=内容
引用变量时在变量名前加 $ 符号。为了显眼可以加{},${变量名}。
- 引用
时常会用到字符串,变量也是字符串组成,所以解析的时候就需要分辨到底是变量还是字符串。
双引号:允许引用、转义
单引号:禁止引用、转义
反撇号,或者$():解析这串字符为命令
比如变量PATH ,若是用双引号括起来,echo “$PATH” ,则会输出PATH的内容,单引号括起来则会输出$PATH 这个字符串,反撇号用于放置一个命令,用的时候会返回这个命令的结果而不是这个命令本身那串字符。
- 变量参数
$? : 前一个命令的状态值,0为正常,非零异常
$0 :脚本自身的程序名
$1-$9:第一到第九个位置参数
\$* :命令行的所有位置参数的内容
\$#:命令行的位置参数的个数
- Shell 运算
运算并不是shell的强项,它的用处不在于此,但是有时候还是会用到。
expr 数值 操作符 数值
eg: expr 22 + 33
55
$[ 数值 操作符 数值]
echo $[22 + 33]
- 字符串处理
1.
两个命令:dirname、basename
前者获取一个包含路径的字符串的路径部分,后者获取这个字符串指示的文件。
isstack@isstack-virtualmachine:~\$VAR="/etc/httpd/conf/httpd.conf"
isstack@isstack-virtual-machine:~\$dirname \$VAR
/etc/httpd/conf
isstack@isstack-virtual-machine:~$basename \$VAR
httpd.conf
2.
也可以用expr表达式截取字符串
expr substr $VAR 起始地址 截取长度
isstack@isstack-virtual-machine:~$ var=helloworld
isstack@isstack-virtual-machine:~$ expr substr $var 2 5
ellow
3.
${VAR:起始地址:截取长度}
isstack@isstack-virtual-machine:~$ echo \${var:2:5}
ellow
还可替换字符串{var/old/new}
${var//old/new}
前者替换找到的第一个old字符串,后者会替换所有含old的字符串
- 条件测试
-e:目标是否存在(exist)
-d:是否时目录(directory)
-f:是否是文件(file)
权限测试
-r:是否有读取权限
-w:是否有写入权限
-x:是否有可执行权限
有两个格式可选择:
1. test 条件表达式
2. [ 条件表达式 ]
[ -f "/etc/profile"] && echo YES
YES
整数值比较:
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
字符串匹配:
=:字符串相同
!=:字符串不同
- 分支命令
if 语句
if 条件测试
then 命令序列
elif 条件测试
then 命令序列
else 命令序列
fi
for语句
for 变量名 in 取值列表
do
命令序列
done