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

shell基础语法

2016-01-15 18:49 429 查看
一、shell约定

shell脚本文件扩展名为.sh

第一行:#!/bin/bash #! 表示该脚本所使用的解释器

chmod +w bash文件名 将该bash修改为可执行

执行bash方法: ./t.sh

注意:在执行脚本时可能会出现:

-bash: ./shell.sh: /bin/bash^M: bad interpreter: No such file or directory的错误

解决办法:执行sed -i "s/\r//" filename(脚本文件名) 然后在执行脚本

二、变量

1. shell脚本没有数据类型,在定义变量时,无需使用关键字声明,直接给出变量名:v1="tom" //注意变量赋值使用双引号

定义变量名要遵循一下规则:

1)变量名的首字符必须为字母

2)不可包含标点

3)不可为关键字

4)中间可包含_

2. 只读变量:使用readonly修饰,只读变量不可修改 ;用法: readyonly name="zhangsan"

或者 在定义变量之后修饰:name="zhangsan" readyonly name

3. 删除变量:使用关键字unset 变量名 例如:unset name 删除该变量之后,该变量的值为空

4. 变量的使用:${变量名} 或 $变量名 例如:echo "my name is ${name}" 这个时候一定要加上{}

5. 特殊变量:具有特定含义的变量,例如:$$ 表示当前shell的pid

经常使用的特殊变量有:

$0 当前脚本的文件名

$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$# 传递给脚本或函数的参数个数。

$* 传递给脚本或函数的所有参数。

$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$? 上个命令的退出状态,或函数的返回值。

$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID

其中$*与$@都表所有的参数,但是当参数使用双引号时,例如("zhangsan" "lisi") $@表示的参数以空格隔开,而$*没有

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,

大部分命令执行成功会返回 0,失败返回 1。不过,也有一些命令返回其他值,表示不同类型的错误。

三、 转义字符:/n /t /f /r 在使用转义字符的时候,要使用-e 说明

例如:a=10

echo -e "the num a is ${a} \n"

得到的结果是the num a is 10 (后面有一个空行) 不加-e 则输出the num a is 10 \n

四、命令替换:指将命令执行的结果保存起来,在适当的时候输出

使用方法:`command` (注意此处的``是esc键下的)

例如:Date=`data`

echo $Date

五、变量替换:根据变量的状态(是否为空或者unset)来改变它的值

${var:-word} 如果var为空或者被unset,则返回word(此处的word并不是变量,而是一个值),不改变var的值

${var:=word} 如果var为空或者被unset,则返回word,并且将word赋给var

${var:?messgae} 如果var为空或者被unset,则直接message输出 并且停止运行

${var:+word} 如果var不为空或者没有被unset 则返回word,不改变var的值

例如:

#!/bin/bash

num1=10

num2=12

unset num1

message="error num1 is null or unseted"

i=${num1:-num2} #num2 此时num1仍然处于被删除状态

echo $i

i=${num1:=num2} #num2 此时num1的值变为num2

echo $i

i=${num1:+message} #message 此时num1的值为num2

echo $i

unset num1

i=${num1:?message} #message 此时抛出message 并且不执行后面的echo

echo $i

六、运算符

1. 算数运算符

a=20 b=10

+ 加法
`expr $a + $b` 结果为 30。

- 减法
`expr $a - $b` 结果为 10。

* 乘法
`expr $a \* $b` 结果为 200。

/ 除法
`expr $b / $a` 结果为 2。

% 取余
`expr $b % $a` 结果为 0。

= 赋值
a=$b 将把变量 b 的值赋给 a。

== 相等。用于比较两个数字,相同则返回 true。
[ $a == $b ] 返回 false。

!= 不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。

注意:表达式和运算符之间要有空格

·expr $a == $b· 结果是0

·expr $a != $b· 结果是1

不可使用i=[ $a == $b ] 进行赋值,通常用于if中

2. 关系运算符(只支持数字或数字字符串)

-eq
检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。

-ne 检测两个数是否相等,不相等返回 true。
[ $a -ne $b ] 返回 true。

-gt 检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。

-lt 检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。

-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。

-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。

注意:[ 与 $a 之间要有空格

3. 布尔运算符

! 非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。

-o 或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a 与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。

4. 字符串运算符

= 检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。

!= 检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。

-z 检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。

-n 检测字符串长度是否为0,不为0返回 true。
[ -n $a ] 返回 true。

str 检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。

5. 文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

-b file
检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

-c file
检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

-d file
检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。

-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。

-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。

-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。

-p file
检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。

-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。

-r file
检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。

-w file
检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。

-x file
检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。

-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。

-e file
检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

七、注释:sh里没有多行注释,只能每一行加一个#号。

八、字符串:即可用单引号,也可用双引号(最好使用双引号)

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单引号(对单引号使用转义符后也不行,内部使用单引号无效)

双引号的优点:

双引号里可以有变量

双引号里可以出现转义字符

1,字符串拼接 语法:"str1"$str2"" 或 ""$str1""str2"",即内部嵌套

2,字符串的长度 语法:${#str},例如 str="abc" echo ${#str} 得到3

3,提取字符串 语法:${str:begin:length}/${str:begin} 例如:str="abcd" echo ${str:1:2} 得到bc

4,查找字符串 语法: ·express index "$str" s· 例如:str="my name is tom" echo `expr index "$str" tom`

九、数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始编号。获取数组中的元素要利用下标,

下标可以是整数或算术表达式,其值应大于或等于0。

用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value1 ... valuen)

或array_name[0]=value1 array_name
=valuen 单独定义

读取数组:${array_name
} //n表示下标,从0开始、可以是变量、表达式

数组大小:${#array_name[*]} 或 ${#array_name[@]}

输出数组所有元素:${array_name[*]} 或 ${array_name[@]}

十、控制结构

1.if选择

if[] then fi

if[] then else fi

if[] then elsif else fi

2.for循环

for var in 列表(用空格隔开,注意不能是一个数组变量)

do

done

3.while循环

while []

do

done

4.until []

do

done

注意:while与unitl的判断正好相反,while为true时继续执行,而until为true则退出

5.case var in conditions) command ;; esac

例如:

case $num in

1)

echo "you print 1"

;;

2)

echo "you print 2"

;;

*)

echo "you num ..."

;;

esac

break、continue:break是终止循环,continue是直接执行下此次循环,跳过continue后的

十一、函数

Shell 函数必须先定义后使用。函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如

一个字符串,往往会得到错误提示:“numeric argument required”。如果一定要让函数返回字符串,那么可以先定义一个变量,

用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

函数的调用:函数名称即可,如果有参数,直接在函数名后面用空格隔开(调用不需要())

str="abc"

function hello()

{

echo $str

str="def"

echo "hello"

return 22 //如果有返回值,则使用return ,那么$? 的结果return后的结果 ,如果没有返回值$?为0或其他数字

}

hello

echo $?

echo $str

得到的结果:abc

hello

22

def

----------------------------------------

function hi()

{

echo "hi $*"

}

hi "tom" "jack"

得到的结果:hi tom jack

$*:所有参数 $n:第n个参数 $#:参数的个数

删除函数:unset 函数名 例如:unset hi

unset -v 变量名 unset -f 函数名

unset 函数名或变量名

十二、shell文件包含:一个shell文件可以包含另一个shell文件,使用source 文件名 或. ./文件名,其中函数名和变量可以共享

shell.sh

#!/bin/bash

function hi()

{

` cd /home/hollysp/22 `

` touch t4.sh `

}

t1.sh

#!/bin/bash

source shell.sh #. ./shell.sh 注意第一个点和第二个点之间要有空格

hi

调用./t1.sh 查看文件创建成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: