#!/bin/bash


shell的两种运行方式

改变权限chmod u+x

运行时指定解释器


shell变量

变量类型

访问变量

$、${}

只读变量

readonly

删除变量

unset取消变量,但不能取消只读变量

1
2
3
myUrl= "http://lingdandan.blog.51cto.com"
unset myUrl
echo $myUrl

运行结果:

wKiom1fAD5fRlJ6AAAATzUTtFHQ952.png

1
2
3
4
myUrl="
readonly myUrl 
unset myUrl
echo $myUrl

运行结果:

wKioL1fAEBCjEg1hAAAoRVezDBM645.png


shell字符串

字符串可以用单引号,也可以用双引号,也可以不用引号

单引号

单引号中的字符都会原样输出

单引号中间不能有单引号(转义字符也不行)

双引号

双引号里面可以有变量

单引号可以有转义字符

字符串拼接

LANGUAGE=English

echo "hello ${LANGUAGE}"

字符串长度计算  

echo ${#VAR}

echo ${VAR} | wc -c

echo $TEST_SHELL_VAR | awk '{print length ($0)}'

提取子字符串

#*字符

##*字符

%字符*

%%字符*

shell脚本_第1张图片

VAR代表变量

${VAR:0:10}  表示从左边第一个字符开始之后的10个字符

${VAR:7}    表示从第七个字符开始之后的所有字符

${VAR:0-3:10} 表示从右边数的第三个字符开始之后的10个字符

${VAR:0-14}  表示从右边数的第14个字符开始之后的所有字符

shell脚本_第2张图片

查找字符串

   

Shell数组

数组定义

bash只支持一维数组,不支持多维

下标从0开始,可以是整数或者表达式

arr=(值1 值2 值3)      圆括号   空格隔开

也可以单独定义各个分量

数组读取

${arr[下标]}

使用@可获得数组的所有元素  

wKiom1fAM3PzV7ouAAAILIhB1ig993.png

获取数组长度

${#arr[@]}

${#arr[*]}

shell脚本_第3张图片


shell传参

脚本内获取参数的格式:$n

$0 $1 $2

shell脚本_第4张图片

$*和$@都是引用所有参数,它们的区别在于$*把参数当作一个字符串,$@把参数当作一个一个的字符串

$*  "1 2 3"     只传了一个参数

$@  "1" "2" "3"  传来三个参数

shell脚本_第5张图片


shell基本运算

原生的bash不支持简单的算术运算,可通过别的命令如awk和expr来完成

算数运算

+ - * / % = == !=

VAR=`expr 3 \* 5`

关系运算符

-eq -nq -gt -lt -ge -le

关系运算符只支持数,不支持字符串

shell脚本_第6张图片

字符串运算

=   !=   -z  -n   str


expr  http://lingdandan.blog.51cto.com/10697032/1791485

    expr match 字符串 表达式    expr 字符串 : 表达式

    expr index 字符串 字符

    expr length 字符串

    expr substr 字符串 偏移量 长度  (偏移量从1开始)

布尔运算

! -o -a

逻辑运算符

&& ||

文件测试运算符

[ -f file ] -d  -b  -c  -p  -r  -w  -x  -s(文件是否大于0)  -e(目录或文件是否存在)


shell echo命令

1、echo "str"     

  echo str

2、echo "\"str\""

3、echo -e "hello \nworld"      #-e开启转义    换行

4、echo -e "hello \c"       #-e开启转义   不换行 抑制输出结果中的换行字符

  echo "world"

5、echo "$var is good!"

6、echo "hello world" >file

7、echo '$var is good!'    #原样输出字符串不进行转义,使用单引号

8、echo `date`  #显示命令结果


shell printf

默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n

语法:  printf 格式控制字符串 参数列表


shell test命令

数值测试 -eq -ne -ge -le -gt -lt

字符串测试 = != -z -n

文件测试 -d -f -c -b -r -w -x -e -s



shell 流程控制

if

for

for 变量 in 列表

do

done


for var in list1 list2 list3...

do

command

done


或者写成一行for var in list1 list2;do command1;command2; done;

shell脚本_第7张图片

while

until

case

break

continue


shell函数

[function] func[()]

{

    action

    [return int;]

}

函数返回值,可以显示的加return,如果不加将以最后一条命令的结果,作为返回值,

return后面跟的数为0-255

下图为加return和不加return的区别

shell脚本_第8张图片

shell脚本_第9张图片

return的范围

shell脚本_第10张图片

函数参数

在函数内部通过$1 $2 $3 ...${10}... 来获取参数

$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数

$$ 当前进程的ID

$! 后台运行的最后一个进程ID

$@ 和$*相同

$- 记录当前设置的shell选项 himBH是默认值 http://kodango.com/explain-shell-default-options

$? 获取退出码


shell输入输出重定向

command >file 将输出重定向到file

command

command >>file将输出追加到file

n >file     将文件描述符为n的文件重定向到file

n >>file    将文件描述符为n的文件追加到file

n >&m      将输出文件m和n合并

n <&m      将输入文件m和n合并

<


默认情况下command >file将stdout重定向到file

默认情况下command


输出重定向 

comand >file

comand

comand output


shell文件包含

有test1.sh和test2.sh两个脚本

内容分别如下:

shell脚本_第11张图片

运行test2.sh的结果如下:(其中test1.sh不需要可执行权限)

wKioL1fCjGaydX5zAAAO356OH94828.png

由上可见,test2.sh引用了test1.sh的内容,有以下两种表示方式

. filename

source filename