Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell脚本(shell script),是一种为Shell编写的脚本程序。
Shell 环境
Shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。常见的Shell有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
一般在第一行需要指定解释器信息,#!
标记 用于指定脚本执行的解释器。
#!/bin/bash
echo "Hello World !"
代码第一行表示这个脚本是 Bourne Again Shell,用此脚本的解释器运行
- 运行脚本的方式有两种
1)作为可执行程序
上面输出"Hello World !"的脚本程序,将其命名为test.sh,cd到test.sh文件的目录
2)作为解释器参数# 获取脚本文件的执行权限 # Unix和Linux系统每个文件(文件夹也被看作是文件)都按读、写、运行设定权限 # 读、写、运行三项权限用数字表示:Read(r=4),Write(w=2),eXecute(x=1) # 7=r+w+x,表示同时设置读、写、运行的权限 # 一般chmod同时设置文件的三种角色的权限:文件拥有者权限、拥有者所在用户组成员权限和其他用户权限 # chmod 755 test.sh 表示设置拥有者有读写运行权限,用户组成员和其他用户只有读和运行的权限 chmod 755 test.sh # 执行脚本。执行的结果是在终端打印 Hello World ! ./test.sh
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名。这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。/bin/sh test.sh # 运行Bourbon Shell脚本 /usr/bin/csh test.csh # 运行C Shell脚本
Shell 变量
定义变量时,变量名不加美元符号,使用定义过的变量需要在变量名前面加美元符号($
) 。shell是弱类型语言,所以定义时不需要使用类型限定,并且变量可以修改类型(重新定义),如下定义了一个字符串类型的str变量,之后修改为数值类型。
注意:变量等号两边不能有空格出现
str="string" # 定义字符串类型的变量
echo $str # 打印变量,使用变量时在前面加 $ 符号
echo ${str} # 使用变量时加花括号(可选),帮助解释器识别变量边界
str=123 # 重新定义,定义值为123的数值类型变量
echo $str
输出结果:
string
string
123
使用readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
var1="只读变量"
readonly var1
使用unset
命令可以删除变量,变量被删除后不能再次使用。unset
命令不能删除只读变量。
#!/bin/bash
var1="这是一个变量"
unset var1
echo ${var1} # var1变量已被删除,这句不会有任何输出
shell有三种变量:
1)局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2)环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3)shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
str='this is a string'
双引号
- 双引号里可以有变量;
- 双引号里可以出现转义字符.
str1='Shell'
str2="very nice"
str3="${str1} is a code language ! \"$str2\"."
echo $str3
echo hello world ! # 不加引号直接使用字符串
输出:
Shell is a code language ! "very nice".
hello world !
拼接字符串
nameVal="Jason"
# 使用双引号拼接
greeting="hello, "$nameVal" !"
greeting_1="hello, ${nameVal} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$nameVal' !'
greeting_3='hello, ${nameVal} !'
echo $greeting_2 $greeting_3
输出结果:
hello, Jason ! hello, Jason !
hello, Jason ! hello, ${nameVal} !
获取字符串长度
string="abcd"
echo ${#string} # 输出 4
提取子字符串
以下实例从字符串第 2 个字符开始截取 5 个字符:
string="have a nice day !"
echo ${string:1:5} # 输出 ave a
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
注意: 以上脚本中`
是反引号,而不是单引号'
。
Shell 数组
bash只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(数组的大小没有限制)。数组元素下标从0开始,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
用括号来表示数组,数组元素用"空格"符号分割开。语法格式如下:
数组名=(值1 值2 ... 值n)
# 空格分格
array_name=("Jason" "Jack" "Rose" "Bob")
# 回车换行
array_city=(
"Beijing"
"Shanghai"
"Hangzhou"
)
# 或者使用下标定义,单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制。
array_country[0]="the People's Republic of China"
array_country[1]="America"
array_country[4]="England"
读取数组
读取数组元素值的一般格式是:
获取单个元素值:${数组名[下标]}
使用@
或者*
符号获取数组中的所有元素:${数组名[@]}
country4=${array_country[4]}
echo ${country4}
echo ${array_name[@]}
输出结果:
England
the People's Republic of China America England
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同
# 取得数组元素的个数
array_length=${#array_country[@]}
# 或者
array_length1=${#array_country[*]}
# 取得数组单个元素的长度
length4=${#array_country[4]}
echo 'array_country length : '${array_length}' , '$array_length1'. the length of value index 4 is : '${length4}
输出结果:
array_country length : 3 , 3. the length of value index 4 is : 7
Shell 注释
单行注释以#
开头,注释会被解释器忽略。
多行注释
1)可以用一对花括号括起来一段代码,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
2)多行注释可以使用一下格式:
格式一
:<<EOF
这里是一行注释内容
这里是一行注释内容
EOF
格式二,EOF也可以使用其他符号
:<<'
这里是一行注释内容
这里是一行注释内容
'
:<<!
这里是一行注释内容
这里是一行注释内容
!