linux shell脚本

Posted 张小贱1987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell脚本相关的知识,希望对你有一定的参考价值。

定义:

linux shell script是一组shell命令组成的批处理文件。类似于windows的bat文件。

shell脚本基本语法

  • 每当读取到一个ENTER符号,就开始尝试执行该行的命令。
  • 如果一行的命令太长,可以在行尾使用反斜杠\将命令延续到下一行。

[[email protected] testsh]# cat testenter.sh

echo zjf is a good

man

  • #开头代表注释。

脚本的执行

脚本的执行方式在前几篇文章里有叙述。这里要重点关注这点:

sh和./的方式,需要的权限不一样。sh只需要接受一个参数,所以可读就可以,但是./需要执行权限。

[[email protected] testsh]# chmod 666 testenter.sh

[[email protected] testsh]# sh testenter.sh

zjf is a goodman

[[email protected] testsh]# ./testenter.sh

-bash: ./testenter.sh: 权限不够

数值运算

bash的数值运算可以执行简单的加减乘除,有两种方式:

  • 直接进行数值运算

这种方式,需要让解释器知道当前处理的变量是数值型的。否则将不会进行数值运算。

如下:

错误的方式:

[[email protected]calhost testsh]# x=10;

[[email protected] testsh]# y=2

[[email protected] testsh]# z=x*y

[[email protected] testsh]# echo $z

x*y

及时x和y是数值型的也不行:

[[email protected] testsh]# x=10

[[email protected] testsh]# declare -i y=2

[[email protected] testsh]# z=x*y

[[email protected] testsh]# echo $z

x*y

必须声明z为数值型:

[[email protected] testsh]# x=10;

[[email protected] testsh]# y=2

[[email protected] testsh]# declare -i z

[[email protected] testsh]# z=x*y

[[email protected] testsh]# echo $z

20

  • 使用$((运算内容)),不需要声明数值类型。

注意,这里是两个括号。

[[email protected] testsh]# x=10

[[email protected] testsh]# y=2

[[email protected] testsh]# z=$((x*y))

[[email protected] testsh]# echo $z

20

 

条件逻辑

  • 第一种方式,使用test命令。

test命令不返回true或者false结果,所以使用如下方式是达不到效果的。

if [ $(test -e /etc) ]; then

echo 111

fi

虽然不会报错,但是if条件是不会满足的。

可以通过$?获取test的返回状态码,来判断test成功或者失败。

[[email protected] testsh]# test -e /etc

[[email protected] testsh]# echo $?

0

[[email protected] testsh]# test -e /etc1

[[email protected] testsh]# echo $?

1

正确的使用方式1:

[[email protected] testsh]# test -e /etc && echo "exists" || echo "not exists"

exists

其中,&&后面跟着执行test成功后执行的语句,||后面跟着test失败后执行的语句。

正确的使用方式2:

if test -e /etc

then

echo 111

fi

 

test命令明细,没有必要全部记下来。但是要知道可以做什么:

判断字符串

test –n 字符串                                   字符串的长度非零

  test –z 字符串                                    字符串的长度为零

  test 字符串1=字符串2                    字符串相等

  test 字符串1!=字符串2               字符串不等

判断整数

  test 整数1 –eq 整数2                        整数相等

  test 整数1 –ge 整数2                        整数1大于等于整数2

  test 整数1 –gt 整数2                         整数1大于整数2

  test 整数1 –le 整数2                         整数1小于等于整数2

  test 整数1 –lt 整数2                          整数1小于整数2

  test 整数1 –ne 整数2                        整数1不等于整数2

判断文件

  test  File1 –ef  File2                            两个文件具有同样的设备号和i结点号

  test  File1 –nt  File2                            文件1比文件2 新

  test  File1 –ot  File2                            文件1比文件2 旧

  test –b File                                           文件存在并且是块设备文件

  test –c File                                           文件存在并且是字符设备文件

  test –d File                                           文件存在并且是目录

  test –e File                                           文件存在

  test –f File                                            文件存在并且是正规文件

  test –g File                                           文件存在并且是设置了组ID

  test –G File                                           文件存在并且属于有效组ID

  test –h File                                           文件存在并且是一个符号链接(同-L)

  test –k File                                           文件存在并且设置了sticky位

  test –b File                                           文件存在并且是块设备文件

  test –L File                                           文件存在并且是一个符号链接(同-h)

  test –o File                                           文件存在并且属于有效用户ID

  test –p File                                           文件存在并且是一个命名管道

  test –r File                                            文件存在并且可读

  test –s File                                           文件存在并且是一个套接字

  test –t FD                                             文件描述符是在一个终端打开的

  test –u File                                           文件存在并且设置了它的set-user-id位

  test –w File                                          文件存在并且可写

  test –x File                                           文件存在并且可执行

多重条件判断:

  • if test表达式 #表达式为真
  • if test ! 表达式 #表达式为假 注意!前后有空格
  • test 表达式1 –a 表达式2 #两个表达式都为真 a代表and
  • test 表达式1 –o 表达式2 #两个表达式有一个为真 o代表or

[[email protected] testsh]# if test 1==1 ;then echo 111;fi;

111

[[email protected] testsh]# if test ! 1==1 ;then echo 111;fi;

 

[[email protected] testsh]# if test 1==1 -a -e /etc ;then echo 111;fi;

111

[[email protected] testsh]# if test 1==2 -o -e /etc ;then echo 111;fi;

111

 

  • 第二种方式,使用[]

 虽然 Linux 和 UNIX 的每个版本中都包含 test 命令,但该命令有一个更常用的别名 — 左方括号:[。test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。当您使用左方括号而非 test 时,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。

test 和 [ 的语法如下:

  test expression

  [ expression ]

[[email protected] testsh]# if [ "111"=="111" ]; then echo 111; fi;

111

[[email protected] testsh]# if [ -e /etc ]; then echo 111; fi;

111

字符串的比较

对字符串的比较,如果是变量一定要用""括起来

[[email protected] testsh]# if [ $name=="zjf man" ] ; then echo 111;fi;

-bash: [: zjf: 期待一元表达式

[[email protected] testsh]# if [ "$name"=="zjf man" ] ; then echo 111;fi;

111

因为第一个命令其实变成了if [zjf man=="zjf man" ] ; then echo 111;fi;

判断为空的两种方式:

[[email protected] testsh]# unset name

[[email protected] testsh]# if [ "$name"=="" ] ; then echo 111;fi;

111

[[email protected] testsh]# if [ -z "$name" ] ; then echo 111;fi;

111

 

if判断

 

if空格[空格条件判断空格 ] ; then

    command

elif空格[空格条件判断空格 ] ; then

    command

else

    command

fi

其中,elif和else是可选的。

&&代表and。

||代表or。

[ "$i"=="1" -o "$j"=="1" ] 等于 [ "$i"=="1" ] || [ "$j"=="1" ]

[ "$i"=="1" -a "$j"=="1" ] 等于 [ "$i"=="1" ] && [ "$j"=="1" ]

function功能

[[email protected] testsh]# vim testfunction.sh

 

function print()

{

echo "$1"

}

print 11

print "zjf"

 

[[email protected] testsh]# sh testfunction.sh

11

zjf

 

注意,定义的时候,括号内不能传递参数,参数是通过$1 $2来传递的。$0不是参数,是sh文件的名称。

调用方法的时候,不是通过括号传递参数的方式,而是和调用命令相同的方式。

 

loop循环

 

while空格[空格条件空格]

do

    command

done

 

util空格[空格条件空格]

do

    command

done

[[email protected] testsh]# vim testwhile.sh

 

declare -i i=0

declare -i sum=0

while [ $i -lt 100 ]

do

sum=sum+i

i=i+1

done

echo $sum

 

[[email protected] testsh]# sh testwhile.sh

4950

 

for in循环

 

[[email protected] testsh]# vim testfor.sh

 

users=$(cut -d ‘:‘ -f1 /etc/passwd)

for username in $users

do

echo "i hava a user named $username"

done

 

[[email protected] testsh]# sh testfor.sh

i hava a user named root

i hava a user named bin

i hava a user named daemon

i hava a user named adm

 

for常见用法:

for i in $(seq 10) do 相当于for((i=1;i<=10;i++));

for i in f1 f2 f3 ;do

for i in $(ls)

for循环

注意有两个括号。

for((i=1;i<10000000;i++));do

echo $i
done


以上是关于linux shell脚本的主要内容,如果未能解决你的问题,请参考以下文章

求解答Linux下的一个shell脚本

Linux下如何执行Shell脚本

linux shell脚本执行命令详解

Linux shell 脚本中, $@ 和$# 分别是啥意思?

shell脚本(linux)

如何在windows下使用linux的shell脚本