shell脚本学习记录

来源:互联网 发布:淘宝生活研究所在哪里 编辑:程序博客网 时间:2024/05/01 22:19

Linux/unix上常见的shell脚本解释器有bashshcshksh,习惯上称他们为一种shell

Bashlinux标准默认的shell

Shunix标准默认的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不支持简单的数学计算,但是可以通过其他的命令来实现。exprawk等,其中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[n]}


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

0 0
原创粉丝点击