目录
1、快速了解和使用shell scripts
(1)shell和shellscripts
- shell是一种程序,用户通过shell告诉kernel需要对硬件进行的操作,是用户访问kernel的工具。
- shell scripts是一种使用shell编写的脚本程序,只需要有文本编辑器和解释器就足够了。目前最常用的shell是bash(取代了sh)。
(2)编写一个shell脚本文件并运行
编写一个shell脚本:
[root@localhost bin]# cd ~
[root@localhost ~]# vi hello.sh
### 输入以下内容
#!/bin/bash
:<<EOF
这是一个shell脚本,用于打印heloworld
结束
EOF
echo "helloworld"
- 开头的#!是告诉os需要使用接下来的shell解释器来执行该脚本;/bin/bash指示了执行该脚本的shell程序的路径。
- 作用:当使用./来执行脚本时,读到第一行后知道了需要用/bin/bash来执行该脚本。如果没有这一行将会报错。
- :<<EOF----EOF:这是多行注释,中间的内容都会被注释掉;#是单行注释
运行shell脚本的方式:
[root@localhost ~]# chmod +x hello.sh
[root@localhost ~]# ./hello.sh
helloworld
[root@localhost ~]# sh hello.sh
helloworld
[root@localhost ~]# bash hello.sh
helloworld
- ./方式执行,需要该文件有执行权限(并且文件中指定了shell脚本解释器)
- shell解释器方式执行:需要在文件前指定解释器(bash or /bin/bash)
(3)shell脚本的编写执行基本步骤:
- 建立shell文件:指定解释器,写入命令
- 添加执行权限(chmod +x file.sh)
- 执行shell文件
2、shell变量
详细参考前文:Shell的变量功能
(1)变量的取用:echo
需要在变量名称前面加上 $ , 或者是以 ${ 变量} 的方式来取用都可以。
[root@localhost ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
(2)变量的设定
用『等号(=)』连接变量与他的内容就好啦!举例来说: 我要将 myname 这个变量名称的内容设定为 langxi。
myname=langxi
echo ${myname}
langxi
变量设定的规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
(3) 变量类型:
- 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量,比如上面的myname
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量,比如PATH
- shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,不同类型的变量保证了shell的正常运行,比如PS1
(4)只读的shell变量
要将shell变量变为只读,只需要使用readonly命令在变量名前方即可。设为了只读的变量既不能修改也不能删除变量。否则就会报错
[root@localhost ~]# readonly myname
[root@localhost ~]# myname=zhangsan
-bash: myname: readonly variable
[root@localhost ~]# unset myname
-bash: unset: myname: cannot unset: readonly variable
3、shell字符串
(1)单引号与双引号的区别和作用
shell字符串类型:在shell中字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
使用单引号与双引号的区别是:单引号中不能对其他变量进行引用,只要是单引号中的内容都是字符,也不能进行\转义
[root@localhost ~]# name=langxi
[root@localhost ~]# youname="your name: ${name}"
[root@localhost ~]# echo $youname
your name: langxi
[root@localhost ~]# youname='your name: ${name}'
[root@localhost ~]# echo $youname
your name: ${name}
[root@localhost ~]# youname="我转义了\"这是内容\""
[root@localhost ~]# !echo
echo $youname
我转义了"这是内容"
(2)字符串的操作:长度、子串、位置
- 获取字符串长度:在对变量取值时,使用”#“对字符串变量进行取值
[root@localhost ~]# youname="我转义了\"这是内容\""
[root@localhost ~]# !echo
echo $youname
我转义了"这是内容"
[root@localhost ~]# echo ${#youname}
10
- 提取子字符串:使用字符串的截取命令(索引)提取字串(索引从0开始)
[root@localhost ~]# echo ${youname:1:2}
转义
# 索引从0开始,并且是完全闭区间
- 查找字符串:expr index 可查找某字符在字符串变量中的位置(1)开始
[root@localhost ~]# echo $(expr index ${youname} 我)
1
# 这里查找的是第几个位置
4、shell数组
在bash下,仅仅支持一维数组,并且没有限定数组的大小,不支持多维数组。
类似于 C 语言,数组元素的下标由 0 开始编号(上述字符串也是这样)。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
(1)定义数组:()方式、多级方式、索引方式
# 直接使用()来定义数组
[root@localhost ~]# namearray=(zhangsan lisi wangwu)
# 默认访问namearray[0]
[root@localhost ~]# echo ${namearray}
zhangsan
[root@localhost ~]# echo ${namearray[1]}
lisi
# 多级定义的方式,其实就是多行写入
[root@localhost ~]# namearray=(
> zhangsan
> lisi
> wangwu
> )
[root@localhost ~]# echo ${namearray[2]}
wangwu
# 直接通过索引来定义对应的值,可以跨过中间的索引
[root@localhost ~]# namearray[0]=langxi
[root@localhost ~]# namearray[3]=angel
[root@localhost ~]# echo ${namearray[3]}
angel
[root@localhost ~]# namearray[5]=angel
[root@localhost ~]# echo ${namearray[4]}
[root@localhost ~]# echo ${namearray[5]}
angel
扩展:自己有发现玄机吗?
[root@localhost ~]# youname="我转义了\"这是内容\""
[root@localhost ~]# echo ${youname[0]}
我转义了"这是内容"
[root@localhost ~]# echo ${youname[1]}
[root@localhost ~]# youname[1]=ws
[root@localhost ~]# echo ${youname[1]}
ws
[root@localhost ~]# echo ${youname[0]}
我转义了"这是内容"
(2)数组操作:读取、获取长度
读取数组的内容:通过索引读取:标号、@(所有)
[root@localhost ~]# echo ${youname[0]}
我转义了"这是内容"
[root@localhost ~]# youname[2]=angel
[root@localhost ~]# echo ${youname[@]}
我转义了"这是内容" ws angel
[root@localhost ~]# echo ${youname[1]}
ws
获取数组长度:与字符串类似,需要加"#"号
- 获取元素的个数
[root@localhost ~]# echo ${#youname[@]} # 从头到尾
3
[root@localhost ~]# echo ${#youname[*]} # 读所有
3
- 获取某元素的长度:某元素的索引
[root@localhost ~]# echo ${#youname[0]}
10
[root@localhost ~]# echo ${#youname[1]}
2