Linux开车—Shell脚本

——shell基础

 

其实就是纯文本文件,以固定的语法组织起来。

可以编辑这个文件, • 让这个文件帮我们 一次执行多个 命令。

可以通过一些运算与逻辑判断来帮我们达成某些较复杂 的功能。

shell script如何执行?

 假设程序文件名是:/home/shell.sh

 执行脚本有以下三种方式:

1、直接执行(shell.sh文件必须具备可读与可执行 (rx) • 的权限):

  绝对路径:运行/home/shell.sh 来执行指令

  相对路径:cd到/home/• ,使用 ./shell.sh • 执行

2、 source • 执行 source • shell.sh

3、•bash执行: • bash • shell.sh • sh shell.sh

Shell脚本的形成顺序:

1、创建shell脚本

2、赋予权限

3、执行脚本

 数值运算:简单的加减乘除 格式:$((运算内容)) •

 案例:两数相乘(交互shell脚本)

    例:total=$(($num1*$num2))

 

 test判断命令

 使用范例:test • -e • demo.txt •

 判断某个文件类型

-e • 该文件是否存在? • !!!

-f • 该文件是否存在且为文件(file)? • !!!

-d • 该文件名是否存在且为目录(directory)? • !!!

-b • 该文件是否存在且为一个 block • device • 装置? •

-c • 该文件是否存在且为一个 character device • 装置? •

-S 该文件是否存在且为一个 Socket • 文件? •

-p • 该文件是否存在且为一个 FIFO • (pipe) • 文件? •

-L • 该文件是否存在且为一个连接文件? •

 判断文件权限

-r  • 检查该文件是否存在且具有可读的权限? •

-w • 检查该文件是否存在且具有可写的权限? •

-x • 检查该文件是否存在且具有可执行的权限? •

-s • 检查该文件是否存在且为非空文件?

-u • 检查该文件名是否存在且具有SUID的属性? •

-g • 检查该文件名是否存在且具有SGID的属性? •

判断字符串

test -z • string 判断字符串是否为空?若string为空字符串,则为true

test -n string 判断字符串是否非空?若string为空字符串,则为 false

test str1 • = • str2 • 判断str1是否等于str2,若相等,则返回 true •

test • str1 • != • str2 • 判断str1是否不等于str2,若相等,则返回 false

 

判断符号[](基本跟test相同) !!!

• [ • ] • 脚本范例 (注意[]和脚本之间保留空格)

• ==和!=用于比较字符串;

• 整数比较只能使用-eq,-gt,ge,lt,le这种形式

• [ ]中的逻辑与和逻辑或使用-a 和-o 表示

• &&、||、<和> 操作符如果出现在[ ]结构中的话,会报错。

 

——shell参数

 

比如,ls -al 其中-al就是shell脚本参数,那么我们自己 写的脚本参数该如何使用呢?.

• /path/to/scriptname   arg1   arg2   arg3     arg4

•              $0                   $1           $2           $3               $4 

– $0:代表脚本程序本身

– $1,$2,…:代表后面第一个参数,第二个参数,等等

– $# • :代表后接的参数个数,以上边为例,这里显示为4; •

– $@ • :代表 "$1" • "$2" • "$3" • "$4" • ,每个变量是独立 的(用双引号括起来); •

– $* :代表 "$1 • $2 • $3 • $4" •

 

——条件判断

 条件判断语句

if • [ • 条件判断 ]

  then

if [ • 条件判断 ]; • then •

  条件成立执行,命令;•

fi • 将if反过来写,就成为fi • 结束if语句

&& • 代表 and• || • 代表 or •

 

• 双分支结构

if • [ • 条件1 • ];then

  条件1成立执行,指令集1•

else

  条件1不成执行指令集2;

fi •

 

• 多分支结构

if [ • 条件1 • ];then

  条件1成立,执行指令集1

elif [ • 条件2 • ];then

  条件2成立,执行指令集2

else

  条件都不成立,执行指令集3

fi •

 

case结构条件句

case • $变量名称 in • “值1")

  程序段1

;; •

“值2")

  程序段2

;; •

*)#相当于JAVA中default

  • exit • 1 •

;;

esac

 

——函数定义

 

function • fname() • {

  • 命令

} •

function可省略

 

shell • script脚本检查

• sh [-nvx] • scripts.sh •

• 选项与参数: •

• -n • :不执行script,仅查询语法的问题; •

• -v • :在执行script前,先将scripts的内容输出到屏幕上; •

• -x • :将使用到的script内容显示到屏幕上,这是很有用的 参数; !!!

 

——循环语句

 

– 不定循环:while • do • done  until do • done •  while与until意义相反

– 固定循环:for • … do • done •

 

• while循环语句

while • [ • condition • ] ;do

命令

done •

或者

while • [ • condition • ]

do

命令

done •

 

• until循环语句

until • [ • condition • ];do

命令

done

或者

until • [ • condition • ]

do

命令

done

 

• for循环语句

• for...do...done循环

– 语法

for 变量名 in 变量取值列表

– do

– 命令

– done

• 提示:在此结构中“in变量取值列表”可省略,省略时相当 于使用for i in “$@”.

 

:使用大括号的方法给定循环值

[root@tedu example]# echo {5..1}

5 4 3 2 1

[root@tedu example]# echo {a..z}

a b c d e f g h i j k l m n o p q r s t u v w x y

[root@tedu example]# echo 10.0.0.{5..1}

10.0.0.5 10.0.0.4 10.0.0.3 10.0.0.2 10.0.0.1

 

使用命令给定循环值

使用seq –s 分隔符 起始 步长 终点

[root@tedu example]# seq -s "," 5 -1 1

5,4,3,2,1

获取当前目录下的文件名作为变量列表 打印输出。例:

    #!/bin/sh

    for num in `ls -F`

    do

    echo $num

    done

 

posted @ 2018-08-16 16:26  丶Biu~  阅读(5)  评论(0)    收藏  举报