您的位置:首页 > 运维架构 > Shell

shell脚本学习记录

2015-03-02 15:37 274 查看
Linux/unix上常见的shell脚本解释器有bash,sh,csh,ksh,习惯上称他们为一种shell。
Bash是linux标准默认的shell。
Sh是unix标准默认的shell。
Ash三系统资源占用最少的shell。
csh比较大,功能也比较强大。
Ksh和商业发行版完美兼容。

脚本文件的扩展名并不影响脚本的执行,见名知意即可。
#!是一个约定标记,它告诉系统应该用什么解释器执行,使用那一种shell。#!/bin/bash
执行脚本的时候,使用./test.sh来执行。如果没有./,linux系统会去PATH变量中找,加了./就是在当前路径。
定义变量的时候注意变量和等号之间不能有空格。首个字符必须为字母,中间不能有空格,可以有下划线。定义的时候前面不用加美元符号。使用的时候,加上美元符号即可。变量名外面可以加上大括号,大括号主要是为了帮助解释器识别变量的边界。
重新定义只要当作没有定义过就行了。
定义只读变量,只要在定义好变量后,另起一行,readonlyvar就可以了。
删除变量,unsetvar

$0

当前脚本的文件名

$n

传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

传递给脚本或函数的所有参数。被双引号("")包含时,与
$*稍有不同,下面将会讲到。

$?

上个命令的退出状态,或函数的返回值。

$$

当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID。

echo-e “Value of a is $a \n”这句话中,在引号中使用变量,shell会对其进行替换,就是在表达式中如果有特殊字符,shell会对其进行替换。还有一个就是转义字符,\n这里是换行的意思,前面的-e就是说,对转义字符也进行替换,如果不使用-e,就会输出\n。

转义字符

含义

\\

反斜杠

\a

警报,响铃

\b

退格(删除键)

\f

换页(FF),将当前位置移到下页开头

\n

换行

\r

回车

\t

水平制表符(tab键)

\v

垂直制表符

``反引号,在esc键的下方。
命令替换,`command`先执行命令,把结果存起来,在适当的地方输出。
DATE=`date`这样,即使在后面输出DATE,也是在执行这条语句的时间。

变量替换

形式

说明

${var}

变量本来的值

${var:-word}

如果变量 var为空或已被删除(unset),那么返回 word,但不改变 var的值。

${var:=word}

如果变量 var为空或已被删除(unset),那么返回word,并将var的值设置为
word。

${var:?message}

如果变量 var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。

若此替换出现在Shell脚本中,那么脚本将停止运行。

${var:+word}

如果变量 var被定义,那么返回
word,但不改变var的值。

bash不支持简单的数学计算,但是可以通过其他的命令来实现。expr,awk等,其中expr是最常用
val=`expr2 + 2`
注意,赋值不能有空格,但是计算表达式必须有空格,2+ 2
就不能写成2+2.

-* / % ==
!=,其中要注意的是,*必须加反斜杠\,也就是说2
\* 2才可以。

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq-ne -gt -lt -ge -le
布尔运算
-o或运算-a与运算!非运算
字符串运算。

=

检测两个字符串是否相等,相等返回 true。

[$a = $b ]
返回 false。

!=

检测两个字符串是否相等,不相等返回 true。

[$a != $b ]
返回 true。

-z

检测字符串长度是否为0,为0返回true。

[-z $a ]
返回 false。

-n

检测字符串长度是否为0,不为0返回true。

[-z $a ]
返回 true。

str

检测字符串是否为空,不为空返回 true。

[$a ]
返回 true。

文件测试运算符

操作符

说明

举例

-bfile

检测文件是否是块设备文件,如果是,则返回true。

[-b $file ]
返回 false。

-cfile

检测文件是否是字符设备文件,如果是,则返回true。

[-b $file ]
返回 false。

-dfile

检测文件是否是目录,如果是,则返回 true。

[-d $file ]
返回 false。

-ffile

检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。

[-f $file ]
返回 true。

-gfile

检测文件是否设置了 SGID位,如果是,则返回
true。

[-g $file ]
返回 false。

-kfile

检测文件是否设置了粘着位(StickyBit),如果是,则返回
true。

[-k $file ]
返回 false。

-pfile

检测文件是否是具名管道,如果是,则返回 true。

[-p $file ]
返回 false。

-ufile

检测文件是否设置了 SUID位,如果是,则返回
true。

[-u $file ]
返回 false。

-rfile

检测文件是否可读,如果是,则返回 true。

[-r $file ]
返回 true。

-wfile

检测文件是否可写,如果是,则返回 true。

[-w $file ]
返回 true。

-xfile

检测文件是否可执行,如果是,则返回 true。

[-x $file ]
返回 true。

-sfile

检测文件是否为空(文件大小是否大于0),不为空返回true。

[-s $file ]
返回 true。

-efile

检测文件(包括目录)是否存在,如果是,则返回true。

[-e $file ]
返回 true。

Sh中没有多行注释。

shell中定义字符串可以用单引号也可以双引号,甚至可以不用引号。
单引号中的任何字符都会原样输出,变量无效。但是转义符可以。比如\n
单引号中不能出现单引号,转义也不可以。

定义数组arry=(v1v2)
或者array[0]=v1
使用一般是var=${array[0]}
${array[*]}${array[@]}这两个可以获得数组中所有的元素。
获得数组中元素的个数length=${#array[@]}或者length=${#array[*]}
获得单个元素的长度length=${#array
}

echo命令,在屏幕上打印指定的字符串。Echo“OK!\c”
echo “it is a test”这样不会换行。
Echo“it is a test ” >myfile可以把结果重定向到文件中。这样会覆盖原来的文件里的内容,如果不想覆盖,可以通过>>来重定向。
echo命令中,双引号可有可无,单引号主要是为了原样输出。

选择语句。
If[ expression ]
then
fi
其中注意expression和【】之间有空格。
还有
If[ expression ]
then
else
fi

If[ expression ]
then
elif
then
else
fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: