Shell编程(Shell Script)

一、Script运行准备工作

1)脚本解释器,解释执行脚本的程序bash

#!/bin/bash 需要bash来执行

2)是的脚本有执行属性

chmod +x hello.sh

二、变量

2.1定义变量:

1)variable="felxitao"

定义变量的等号两边不能够有等号。

 

2) for skill in apche nginx redis java c++;do

ehco i am good at ${skill}

done

3)变量的定义可以重复进行,后面的定义结果会覆盖之前的定义值。

2.2变量种类

1)局部变量

局部变量在脚本或命令中定义,仅在当前的shell 实例中有效,其他shell启动程序不能访问该局部变量。

2)环境变量

所有的程序,包括shell启动的脚本都可以访问环境变量,有些程序需要环境变量保证正常运行,必要时可以定义环境变量

3)shell变量

shell变量是由shell程序设定特殊变量。

2.3变量的引用

$来使用变量,可用{}来包围变量

foo="foo"

bar=${foo}

 

2.4只读变量

可以用readonly来修饰变量

foo="abcde"

readonly foo

这样foo就变成了只读变量

2.5变量的删除

变量的删除是可以把之前变量的定义抹除,在之后不可以使用。

foo="bar"

bar=${foo}

unset foo

这样后面就不可以使用foo变量。

 

三、Shell字符串

shell字符串有单引号和双引号的区分。单引号表示原样输出内容,不对字符串内容进行转义,不可以使用单引号,也不可以在其中使用变量。

str1='this is a string with single quotation'

双引号表示可以对其中字符串转义,可以在其中使用变量。

str2="this is a string with double quotation"

3.1字符串操作

1)获取字符串长度

str="abcde"

echo ${#str} 输出的是5

 

2)提取子字符串

str="12345678"

 

echo ${str:1:4} 输出的是2345

表示的是从字符串中第二个字符串开始截取4个字符。

 

echo ${str:1} 输出2345678

表示的是从第二个字符开始一直截取尾部

 

echo ${str:0-4:3}输出567

表示的是从倒数第4个字符开始截取3个字符

 

echo ${str:0-5}输出45678

表示从倒数第5个开始到结束

 

 

 

3)查找字符串

str="123456"

echo `expr index "${str}" is`

查找str中is的位置。

expr 是一个计算工具,还可以用来计算数值

 

4)截取字符串(#,%)

#表示从第一个匹配处截取到结尾,##表示从最后一个匹配处截取到尾部

%表示从第一个匹配处取到头,%%表示从最后一个匹配处截取到头


  1. str="http://10.12.73.112/data/operate?type=0001

 


  1. ${str#*//}

输出10.12.73.112/data/operate?type=0001

这里#表示从第一个匹配处开始截取到结尾,*//表示匹配规则,匹配//,正则表达式类似

 


  1. ${str##*/}

输出/10.12.73/data/operate?type=0001

表示从最后一个匹配项开始截取到尾部

 


  1. ${str%/*}

输出http://10.12.73/d ata

表示从尾部开始第一个匹配处,截取到开头。

四、Shell数组

4.1数组的定义和操作

array=(1 2 3 A B C)

利用小括号包围变量,同时各个数组元素之间用空格隔开。

echo ${array[1]} 输出的是2

表示引用第二个变量。

 

echo ${array[*]}输出 1 2 3 A B C

表示输出所有的元素。

 

echo ${#array[*]}输出6

表示获取数组的元素个数。

 

五、运算符

5.1算术运算符

算术运算需要用到expr命令

a=10

b=12

val=`expr $a + $b`

echo val输出22

运算符为以下

+ - * / % = == !=

注意:这些运算符和运算元之间得有空格隔开,另外*运算符需要用\*转义符

 

5.2关系运算符

只是用来比较数值,运用于条件表达式中

a=10

b=12

if [ $a -eq $b ]

then

echo a equal b

fi

注意:这里的[ $a -eq $b ]表达式在[]两边留有空白,另外运算符和变量之间留有空白,

不是[$a-eq$b]。

-eq 相等关系

-ne 不相等

-lt 左边运算元小于右边运算元

-gt 左边运算元大于右边运算元

-le 左边小于等于右边

-ge 左边大于等于右边

 

5.3布尔运算符

! 非

-o or有一个表达式为真,即为真

-a and两个表达式都为真,才为真

 

[ $a -lt $b -o $a -gt $b -a $a -eq $b ]

 

5.4字符串运算符

只用来检查字符串的关系

str1=abced

str2=asdf

if [ $str1 != $str2 ]

then

echo true

fi

输出true

还支持一下运算符

= 检查字符串是否相等 [ $a = $b ]

!= 检查字符串不相等 [ $a != $b ]

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

-n 检查字符串长度是否为0,不为0则返回true

[ $a ] 字符串为空则返回false,不空返回true

 

5.5文件测试运算符

[ -r $file ]文件可读,输出true

[ -w $file ]文件可执写,输出true

[ -x $file ]文件可执行,则输出true

[ -s $file ]文件是否为空,不空返回true

 

六、流程控制

6.1分支

1)

if

then

...

fi

2)

if

then

...

elif

then

...

fi

 

6.2循环

str="abd afaf afaf"

1)for循环

for var in item1 item2 itemN

do

command

done

 

2)while 循环

while condition

do

command

done

 

注意:一般用循环也需要要用到循环计数,需要实现递增,可以用

let "index++"命令或者利用 declare -i index=0来定义一个数值变量。

6.3 case

case var in

var1)

command1

command2

...

command3

;;

var2)

command4

...

;;

esac

 

七、函数

[ function ] funname[ () ] {

action1

action2

[return int;]

}

形如这样的定义。函数可以传递进入参数,调用是直接用函数名,后面可以跟参数,用空格隔开,这样就类似于脚本的参数一样。

举例:

1)定义

function fun() {

echo "第一个参数是${1}"

echo "第一个参数是$1"

...

echo "第n个参数是 ${n}"

return $((${1} + ${2}))

}

2)调用

fun 1 2 3 4 5 ...

 

3)获取调用结果

echo $?可以得到函数返回的结果。

 

八、重定向

>file重定向到文件,刷新文件内容

>>file向文件尾部追加内容

 



 


你可能感兴趣的:(Language)