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

Shell脚本点滴

2015-04-14 16:12 288 查看
===============

1.判断文件夹是否存在
if [ -d ./bin ];

===============

2.判断文件是否存在
if [ -f ./1.txt ];

或者

if test -f aa.txt;then

  echo 存在;

fi

===============

算数运算

echo 1+2

Shell并没有输出结果3,而是输出了1+2。在shell中有三种方法可以更改运算顺序。

1.用expr改变运算顺序。

可以用echo `expr 1 + 2`来输出1+2的结果。

用expr表示后面的表达式为一个数学运算。

需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号。

2.用let指示数学运算。

可以先将运算的结果赋值给变量b,运算命令是let b=1+2。

然后用echo $b来输出b的值。如果没有let,则会输出1+2。

Let expressions 执行一个或多个表达式。表达式中的变量前不必有$.

如果表达式中包含了空格或其他特殊字符,则必须引起来。

i=111

let "i =i+ 22"

或者

let i=i+33

3.用$[]表示数学运算。

将一个数学运算写到$[]符号的中括号中,中括号中的内容将先进行数学运算。

例如命令echo $[1+2],将输出结果3。

自增

i=1

echo $[i++]

echo $[++i]

===============

位置参数

由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。

类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。

第0号为程序名字,从1开始就表示传递给程序的参数。

如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。

上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。

 $0:命令含命令所在的路径。

 $#:传递给程序的总的参数数目。

 $?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。

 $*:传递给程序的所有参数组成的字符串。

===============

字符串比较

字符串操作符   含义及返回值

=              比较两个字符串是否相同,相同则为“真” 

!=             比较两个字符串是否不相同,不同则为“真”

-n             比较字符串长度是否大于零,若大于零则为“真”  

-z             比较字符串长度是否等于零,若等于零则为“真”

aa=abce

bb=abcd

if [ $aa = $bb ];then

  echo a和b相等

else

  echo a和b不等

fi

aa=

if [ -z $aa ];then

echo aa长度等于零

else

echo aa长度不等于零

fi

===============

数字比较

在Bash Shell编程中的关系运算有别于其他编程语言,用test语句表示大小的比较

运算符号    含义

-eq        相等      

-ge        大于等于      

-le        小于等于      

-ne        不等于      

-gt        大于      

-lt        小于

===============

 1>/dev/null 2>&1的含义

shell中可能经常能看到:>/dev/null 2>&1

/dev/null 代表空设备文件

> 代表重定向到哪里,例如:echo "abc" > /home/123.txt

1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

2 表示stderr标准错误

& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

那么本文标题的语句:

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。

2>&1,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

===============

循环结构语句

for循环

语法:

for 变量 in 列表

  do

     操作

  done  

for i in a,b,c,e,i  2,4,6,8

do

 echo $i

done  

注意: 在循环列表中的空格可表示换行。

for((j=1;j<=100;j++));

for语句中的双括号不能省,最后的分号可有可无。  

===============

case语句

    

语法:

case 表达式 in

值1|值2)

操作;;

值3|值4)

操作;;

 

*)

操作;;

esac

case的作用就是当字符串与某个值相同是就执行那个值后面的操作。

如果同一个操作对于多个值,则使用“|”将各个值分开。

在case的每一个操作的最后面都有两个“;;”分号是必需的。

===============

判断文件大小

a=$(ls -l $filename | awk '{ print $5 }')

if test $a -eq 0

  echo 文件大小为0

fi 

===============

sed实现直接修改文件内容

sed是实现对流的编辑。通常,我们使用sed可以实现内容的编辑后然后保存成另外的一个文件,如果正确的话,才写入到源文件。

但是某些时候,我们需要直接修改文件,因为,保存文件到一个文件,然后再覆盖原文件的办法显得很麻烦。

其实很简单,只需要一个 -i 参数就可以了。

比如,我想替换文件中的 properties 为 property ,可以使用

sed  's/properties/property/g'  build.xml

[注] 's/{old value}/{new value}/'

这种方式,其实并没有修改build.xml文件的内容。如果想保存修改,通常的做法就需要重定向到另外的一个文件

sed  's/properties/property/g'  build.xml > build.xml.tmp

这样,build.xml.tmp文件就是修改后的文件.

如果无误,那么就可以用

mv build.xml.tmp build.xml

覆盖原文件。

如果想直接修改源文件,而没有这样的过程,可以用下面的命令

sed  -i 's/properties/property/g'  build.xml

这样,就直接修改了build.xml文件

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