shell脚本语法

Shell脚本

本质:shell命令的有序集合
1.存放shell命令
2.通过语法格式来管理命令

后缀名:.sh
基本过程分为三步:

  1. 建立 shell 文件
    包含任意多行操作系统命令或shell命令的文本文件;
  2. 赋予shell文件执行权限
    用chmod命令修改权限;
  3. 执行shell文件
    直接在命令行上调用shell程序.

shell变量

Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符

四种变量:

1.用户自定义变量
2.环境变量
HOME: /etc/passwd文件中列出的用户主目录
PATH:shell搜索路径
3.位置变量即 命令行参数
$0 : 与键入的命令行一样,包含脚本文件名
$1~$9 :分别包含第一个到第九个命令行参数
10   {10}~ 10 {n}: 存放第十个到第n个命令行参数。
4.预定义变量
shell解释器预先定义好的变量,用户只能根据定义使用,而不能修改变量的定义
$# 包含命令行参数的个数,不包含脚本文件名
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态
如果命令正常执行,则值为0;否则为非0值
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程 的ID号

shell程序和语句

1.说明性语句:
以#号开始到该行结束,不被解释执行
#!如果加在文件开头,告知操作系统使用哪种类型的shell解释器来解释执行当前脚本文件
如果没有加在文件开头,则仍然表示一行注释
2.功能性语句:
任意的shell命令、用户程序或其它shell程序。
3.结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。

read

read从标准输入读入一行, 并赋值给后面的变量,其语法为:
read var
把读入的数据全部赋给var

read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.

expr

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操作。
引用命令执行结果:反撇号、$()
注意:运算符前后必须有空格

test

test语句可测试三种对象:
字符串 整数 文件属性
1.字符串测试
s1 = s2 测试两个字符串的内容是否完全一样,如果一样,则命令执行结果为真
s1 != s2 测试两个字符串的内容是否有差异
2.整数
-eq 测试两个整数是否相等
-ne 测试两个整数是否不相等
Var1 -gt Var2 测试Var1是否大于Var2
Var1 -ge Var2 测试Var1是否大于等于Var2
Var1 -lt Var2 测试Var1是否小于Var2
Var1 -le Var2 测试Var1是否小于等于Var2
3.文件属性
test -[文件类型]

注意:test命令可以用[]代替,[]与里面的内容必须用空格隔开

$?用法

1.包含前一个命令的退出状态
2.保存test命令的测试结果。
如果测试条件为真,则值为0,否则为非0值
3.保存shell函数的返回值
【6】结构性语句
1.条件语句
(1)if…then…fi
语法结构:
if    表达式
then  命令表
fi     
如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
(2)if…then…else…fi
语法结构为:
if      表达式
then 命令表1
else  命令表2
fi
(3)if…then…elif…then…else…fi
语法结构为:
if      表达式
then 命令表1
elif	表达式

then	命令表2
…
else  命令表
fi
2.多路分支语句 
case…esac 
case   字符串变量   in
模式1)
        命令表1
         ;;
模式2)
        命令表2
         ;;
……
模式n)
        命令表n
         ;;
esac
3.循环语句
(1)for…do…done
当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。  循环体由语句括号do和done来限定。格式为:                
for  变量名 in $单词表
do
语句块
done
变量依次取单词表中的各个单词,  每取一次单词, 就执行一次循环体中的命令.循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
如果单词表是命令行上的所有位置参数时, 可以在for语句中省略 “in  单词表” 部分。

(2)while…do…done
语法结构为:      
while  命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
while语句的退出状态为命令表中被执行的最后一条命令的退出状态。

breakcontinue 
break  n  跳出n层;  
continue 马上转到最近一层循环语句的下一轮循环上,  
continue n 转到最近n层循环语句的下一轮循环上.

shell函数

1.函数定义格式:
(1).function_name ( )
{
command1
……
commandn
}

(2).function function_name ( )
{
command1
……
commandn
}
2.函数调用
直接输入函数名
注意:先声明再调用
3.函数变量
函数变量作用域
全局作用域:在脚本的其他任何地方都能够访问该变量。

局部作用域:只能在函数体内访问。

声明局部变量的格式:
local variable_name =value
注意:如果在函数体内的变量没有用local声明,则仍然是全局变量
4.函数传参
通过位置变量传参 $1,$2,$3
注意:该位置变量直接跟在调用的函数名后,而不是命令行下的位置变量
5.函数返回值
$?

你可能感兴趣的:(tools)