Shell

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" ]

<    小于,需要双括号,如: 

<=

>

>=

posted on 2016-04-10 17:54  King-Penguin  阅读(246)  评论(0编辑  收藏  举报

导航