shell编程基础知识点

来源:互联网 发布:雾霾防护口罩知乎 编辑:程序博客网 时间:2024/06/07 17:35

shell知识点

1.shell入门

2.基本语法

3.shell命令

4.流程控制

5.shell函数

6.输入输出重定向

7.文件包含

=====================================================================

 

一、shell入门

1.第一个shell程序

#!/bin/bash

echo "Hello world!"

文件名:first.sh

注意:如果在Windows环境下编辑了一个.sh的shell脚本,发现直接在linux下运行出现这个错误:gec@ubuntu16:/mnt/hgfs/share/13.shell$ ./test.sh

bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

是由于在Windows环境下编辑的代码格式为dos,需要修改为unix。

解决方式:

vi进入文件,直接 :set ff,可以查看文件格式,如果是dos,需要修改为unix

修改 set ff = unix,保存退出

2.shell简介

①主要用途:用来开发一些自动化的小工具

②shell是一种脚本语言

③编译型语言:C/C++、Java、C#、Go:先编译,后执行

解释型语言:PHP、HTML、SHELL、python:边执行边解释

④脚本语言:使用灵活、部署容易、跨平台性好,适合用于web开发和小工具开发

⑤查看shell解释器:cat /etc/shells

查看默认shell:echo $SHELL

shell是一个程序环境,一般都放在/bin,当前linux系统可用的shell记录在 /etc/shells

3.执行shell脚本

①作为可执行程序运行:   ./first.sh

②作为解释器参数运行:  /bin/bash ./first.sh

 

二、基本语法

1.shell变量

shell中,每一个变量的值都看做一个字符串,以字符串的形式存储

0.定义变量:

variable=value

注意:variable表示变量名,value表示变量值,中间=与前后不加空格

shell变量名的命名规则:

·变量名由数字、字母、下划线组成

·必须以字母或者下划线开头

·不能使用shell里面的关键字

①显示

echo $变量名

echo ${变量名}

echo "I am ${name}aaa."

*这里推荐都写上{}

②变量赋值:

变量定义:   zhangsan=lisi

变量赋值:   zhangsan=wangwu

将一个变量赋值给另外一个变量:name=$zhangsan

将一个变量赋值给另外一个变量:name=${zhangsan}

将一个命令的结果赋值给一个变量:zhangsan=$(ls -l)

将一个命令的结果赋值给一个变量:zhangsan=`ls -l`

 

③单引号和双引号的区别

如果是单引号:里面是什么内容就是什么内容,不会去解释,如果是双引号,输出的时候会先解析里面的变量和命令

单引比较适合定义显示纯字符串的情况,并且不希望解析变量和命令

#!/bin/bash

name=zhangsan

stringaaa='I am ${name}'

stringbbb="I am ${name}"

echo $stringaaa

echo $stringbbb

④建议:如果变量是数字,可以不加引号;如果是要原样输出,就加单引号;如果没有其他要求,一般字符串定义的时候就用双引号。

⑤删除变量  unset 变量名

 

⑥特殊变量

$n:表示第几个参数($0 :当前脚本文件名字,如果n>实际传参个数,直接就是n)

$#:表示的是传参个数

$*:表示所有的参数

$@:表示所有参数,被双引号包含时,与$*不同,否则一样

$?:函数返回值,上一条命令的退出状态

$$:表示当前脚本执行shell的进程号

使用:

#!/bin/bash

echo $0

echo $3

echo $#

echo $*

echo $@

echo $$

 

2.字符串

①单引号和双引号

②拼接字符串(类似C语言的sprintf)

name1="abcd"

name2="1234"

name=$name1$name2"asd"

③获取字符串长度

${#name1}

注意:#和变量名之间没有空格

④提取子串

${name:6:2}

name:字符串名称

6:从第六个位置开始截取

2:截取字符个数

⑤查找字符位置

`expr index $name 4`

查找字符‘4’name字符串中的位置

查找子字符串在字符串中的位置

echo `expr index $name $name2`

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

比如:找一个字符串“123456789”8的位置,将此位置后面的字符保存到一个变量

name="123456789"//定义字符串变量

m=${#name}//获取字符串长度

n=`expr index $name 8`//找到字符串中某个字符的位置

name_n=${name:$n:$m}//截取字符串:从第n个字符取,取m个

name_new=$name_n"abcdefg"//拼接字符串

===================================================================

练习:在一个字符串A中,找一个字符,将字符前面的所有内容保存到另外一个变量B中,拼接一个字符串C,显示。

 

3.数组

①定义数组:

a=(1 2 3)

b=(ad asdgf qwer qwer)

b=(

ad

asdgf

qwer

qwer

)

②获取数组元素值

获取某一个元素:

${name[n]}

获取所有元素:

${name[*]}

${name[@]}

③获取数组元素个数:

${#name[@]}

${#name[*]}

④获取数组中某个元素所占字符数:

${#name[3]}

 

4.运算符

shell:算数运算符、关系运算符、布尔运算符、字符串运算符、*文件测试运算符

①数学运算:原生的bash不支持数学运算,shell的表达式计算工具:expr

算术运算符号:

+ 加法 `expr $a + $b`

- 减法 `expr $a - $b`

* 乘法 `expr $a \* $b`

/ 除法 `expr $a / $b`

% 求余 `expr $a % $b`

 

shell原生:

= 赋值运算符 a=$b

== 判断相等,相等返回true

!= 判断不等,不等返回true

 

②关系运算符

== 判断相等,相等返回true

!= 判断不等,不等返回true

 

-eq 判断两个数是否相等 相等返回true

-ne 判断不相等 不相等返回true

-gt 判断左边数大于右边数 是返回true

-lt 判断左边数小

-ge 判断左边数是否大于等于右边数

-le 判断左边小于等于右边

 

③布尔运算符(逻辑运算符)

-a 与运算 [ $a -eq 10 -a $b -ne 20 ]

-o 或运算 [ $a -gt 10 -o $b -lt 20 ]

!  非运算 [ ! false ]

 

5.字符串运算符

= 判断相等

!= 判断不等

-z 判断字符串长度为0

-n 判断字符串长度不为0

[$str] 判断字符串不为空

 

注意:

·在数字关系中,==表示是否相等,=表示赋值

·在表达式关系中,==表示判断相等,=表示赋值

·在字符串关系中,==表示字符串相等,=可以判断相等[ $a = $b]

 

6.文件测试运算符

判断文件类型:

-b:块设备文件

-c:字符设备文件

-d:目录我呢间

-f:普通文件

-p:管道文件

 

判断文件操作权限:

-r:可读文件

-w:可写文件

-x:可执行

 

判断文件是否不为空:

-s

 

判断目录是否存在:

-e

 

写法:

[ 运算符 文件名 ]

判断返回值

 

三、shell命令

1.常用命令在shell脚本

注意:在shell脚本里面,如果有运行程序的语句,不要写直接该脚本本身,否则会进入一个死循环。如果要执行本身,就做一定的处理。

 

2.test测试命令

①数值测试

②字符串测试

③文件测试

例子:

#!/bin/bash

num1=100

num2=100

if test $[num1] -eq $[num2]

then

echo "num1 = num2"

fi

str1="aaa"

str2="bbbb"

if test str1 = str2

then

echo "str1!=str2"

fi

file="./1.txt"

n=$(cat 1.txt)

if test -s $file

then

echo "file : ${n}"

fi

 

四、流程控制

1.if else

if 判断语句

then

......判断成功的执行代码......

else

......判断失败的执行代码......

fi

 

2.if elif ...elif...

if 判断语句1

then

......判断1成功的执行代码......

elif 判断语句2

then

......判断2成功的执行代码......

...

fi

 

3.case ... esca(类似C的switch case)

#!/bin/bash

num=3

case $num in

1)echo "num is \"1\""

;;

2)echo "num is \"2\""

;;

3)echo "num is \"3\""

;;

esac

 

4.for

5.while

6.until

原创粉丝点击