Shell
Shell是一个命令解析器,是介于操作系统Kernel与用户之间的一个绝缘层,准确的说,它也是一种强力的计算机语言。一个shell程序也被成为一个脚本,是一种很容易使用的工具。
编程基础:
一、特殊字符
# 命令行注释,“#”表示后面跟着的是注释,#!是个例外。
(1)注释可以位于行首, 如:#this is an annotation.
(2)注释也可以位于本行命令的后边,如:This is a command. #annotation.
; 命令分隔符,可以用来在一行中来写多个命令。像C程序中“;”的用法。
跟C程序一样,用分号表示一个命令输入的结束。 如:echo hello;echo "use ; !"
. 字符匹配。这是正则表达式的一部分,用来匹配任何的单个字符。
“” 部分引用,“STRING”阻止了一部分特殊字符。后面再详细分析。
'' 全引用,’STRING‘阻止了全部特殊字符。后面详细分析。
, 逗号链接了一系列的算术操作,虽然里边的所有内容都被运行了,但只有最后一项被返回。跟C程序的用法一样。
转义字符。
/ Linux文件名路径分隔符,或用来最除号。
· 后置引用。tab上面的那个。
! 取反操作符。
* 乘法符号或正则表达式中的万能匹配字符。
** 幂运算符
? 正则表达式中匹配一个或没有的字符。
$ 变量替换。在正则表达式的结束标志符。
常用的就是上面几种。
二、变量和参数
1、变量替换。“$” 变量替换操作符。
强烈注意:在赋值的前后一定不能出现空格。
2、赋值。
这里重要要分清:部分引用 “” 、全部引用 ’‘ 、反引号 ·· 的作用。
例子解说变量赋值和替换
例子一
#!/bin/bash
a=123
hello=${a}
echo hello #输出字符串hello
echo $hello #输出 123
echo ${hello} #输出 123 {}相当于C语言的()的用法 为了表达式的严谨,最好在$后面跟上{}
echo "$hello" #输出 123
echo "${hello}" #输出 123
hello="A B C D"
echo ${hello} #输出 A B C D
echo "${hello}" #输出 A B C D 加上部分引用符 “” 能把字符串按原来的格式输出 所以为了程序的严谨,echo后输出的字符串要加“”
echo '${hello}' #在全引号 ‘’ 中,什么元字符都是普通的字符。
uninitialized_variable=23 #赋值
unset uninitialized_variable ; #unset it. 设置变量根本没赋值,为空。
echo "uninitialized_variable = ${uninitialized_variable}"
#输出uninitialized_variable =
let "uninitialized_variable += 5"
echo "${uninitialized_variable}" #对于一个unset的值就相当于0.
例子二
#!/bin/bash
a=23
echo $a #输出 23
b=$a
echo $b #输出 23
a='echo Hello!' #单引号
echo $a #输出 $a
a=`ls` #反引号
#echo $a #这么引用的话有可能ls的结果中所有的空白部分都没了,包括换行。也有可能全部竖着输出
echo "$a" #正常,跟命令敲入ls的结果一样。
3、bash变量不区分类型
bash变量不像其他程序语言,bash不对变量区分“类型”。本质上,bash的变量全都是字符串。
但依赖于上下文,bash也允许比较操作和算术操作,决定这些的关键因素就是要看变量中的值是否只有数字。
用例子来查看Bash上变量是数值还是字符串。
#!/bin/bash
#整形还是字符串
a=12345
let "a += 11" #整形处理
echo "a = ${a}" #输出:12356
b=${a/235/ABC} #将2替换成A,把b变量成整形变成了string
echo "b = $b" #输出:1ABC6
declare -i b #使用declare也没有用
echo "b = $b"
let "b += 1" #报错,let: 1ABC6: value too great for base (error token is "1ABC6")
echo "b = ${b}"
c=${b/ABC/235} #将STRING转换为整形。
echo "c = ${c}"
let "c += 1"
echo "c = ${c}" #输出:12357
#关于空变量
d=""
echo "d = $d" #输出d =
let "d += 1"
echo "d = ${d}" #输出d = 1
#关于为声明的变量
echo "e = ${e}" #输出 e =
let "e += 1"
echo "e = ${e}" #输出 e = 1
结论:Bash中所有的变量都是STRING。
三、Tests
1、if/then结构可以测试命令的返回值是否为0(0表示成功),如果是的话,执行更多命令。
#!/bin/bash
#判断什么时候false为true
if [[ "false" ]]
then
echo "false is true."
else
echo "false is false."
fi #输出:false is true.
if [[ "$false" ]]
then
echo "false is true."
else
echo "false is false."
fi #输出:false is false.
对于shell的if判断而言,判断的只是返回的状态。
2、文件测试操作。
-e 文件存在
-a 文件存在,这个选项的效果和-e相同,但是它已经被弃用。
-f file只是一个regular文件,不是目录或者设备文件。
-s 文件长度不为零
-d 文件是个目录
-b 文件是个块设备,软盘,cdrom等等。
-c 文件是个字符设备,键盘,modem,声卡等。
-p 文件是个管道
-h 文件是个符号链接
-L 文件是个符号链接
-S 文件是个SOCKET
-t 关联到一个终端设备的文件描述符
-r 文件具有读权限
-w 文件具有写权限
-x 文件具有执行权限
-N 从文件最后被阅读到现在是否被修改
f1 -nt f2 文件f1比f2新
f1 -ot f2 文件f1比f2老
f1 -ef f2 f1和f2都硬链接到同一个文件
3、其他比较操作
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于,需要双括号,如:
<=
>
>=