Shell:是一个C语言编写的程序,是用户使用Linux的桥梁。Shell是一种命令语言,又是一种程序设计语言。
Shell脚本(Shell Script):一种为Shell编写的脚本程序
业界所说的Shell都是Shell脚本,Shell编程就是脚本编程
以下为Linux系统中编写Shell脚本
1.创建一个Shell脚本
使用vi
命令来创建文件,扩展名为.sh(.Shell),扩展名并不影响脚本执行
运行Shell脚本的两种方法:
1.作为可执行程序
cd到脚本目录
chmod +x test.sh #使脚本具有可执行
./test.sh
2.作为解释器参数
直接运行解释器
/bin/sh test.sh
2.Shell变量
定义变量时和常用语言一样,不用加$
(PHP中需要)
如:
name="Bunny"
注意:变量名和等号之间不能有空格
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
2.1 使用变量
使用一个定义过的变量,在变量名前加$
即可
$name
${name}
两种方法都可以使用,第二种使系统更容易分清楚边界,所以推荐给所有变量都加上{}
设置只读变量
readonly
myUrl="www.baidu.com"
readonly myUrl #设置完毕后,myUrl只读,不可以改变数值
删除变量
命令unset
可以删除变量
变量类型
(1)局部变量 局部变量在脚本或命令中定义,仅在Shell实例中生效
(2)环境变量所有程序都能访问的变量
(3)Shell变量Shell变量是由Shell程序设置的特殊变量
2.2 字符串
两种表示方法' '
或“ ”
单引号
- 单引号里的字符都会原样输出;
- 单引号中不能加入变量;
- 单引号字符串中不能出现一个单独的单引号,不能使用转义字符。
例子:str='This is a string'
双引号
- 双引号里可以有变量;
- 双引号里可以由转义字符。
例子:
str="Bunny"
echo -e "Hello this is \"$str\"!"
拼接字符串
Your_name="Bunny"
#使用双引号
greeting="Hello "$Your_name""
greeting1="Hello ${Your_name}"
echo $greeting $greeting1
#使用单引号
greeting2='Hello '$Your_name''
greeting3='Hello ${Your_name}'
echo $greeting2 $greeting3
echo $字符变量1 $字符变量2
结果:
Hello Bunny Hello Bunny
Hello Bunny Hello ${Your_name}
获取字符串长度
使用${#变量名}
Your_name="Bunny"
echo "${#Your_name}"
result:5
提取字符串
字符串的计数使用0开始的
实例:从第2个字符向后(包括第2个字符)取4个字符
Your_name="Bunny"
echo "${Your_name:1:4}"
result:unny
查找字符串
查找字符串中 u 和 i 的位置(哪个字母先出现就计算哪个)
string="This is Bunny's test"
echo `expr index "${string}" ui`
注意:
`查找字符串中的是反引号(Tab上面的那个)
而不是单引号’
2.3 Shell数组
bash支持一维数组(不支持多维数组)
定义数组:
在Shell中,用括号来表示数组,数组元素用“空格”符号分隔开;
定义数组的一般形式为:
数组名=(值0 值1 值2 值3 值4…)
可以不使用连续的下标,而且下标没有范围限制
(但排序还是按照下标来排序)
例如:
#创建数组
array_name=(A B C D E)
#添加数组
array_name[6]=G
array_name[5]=F
读取数组
读取数组的一般格式:
${数组名[下标]}
例如:
value5=${array_name[3]}
使用@和*可以获取数组中所有元素
echo ${array_name[@]}
或
echo ${array_name[*]}
读取数组长度
获取数组元素个数
${#array_name[\*]}
或者
${#array_name[@]}
2.4 Shell的注释
单行注释:每一行开头加#
就是加注释
多行注释:(EOF也可以用其他符号)
:<<EOF
注释内容…
注释内容…
注释内容…
EOF
3.SHell传递参数
脚本内获取参数的格式:
$n
,n代表一个数字,$0为执行文件的名称,1为执行脚本的第一个参数,2为执行脚本的第二个参数
实例:
echo "执行的文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
[root@admin world]# ./demo03.sh 1 2 3
执行的文件名:./demo03.sh
第一个参数:1
第二个参数:2
第三个参数:3
处理参数的特殊字符
参数处理 | 说明 |
---|---|
$# | $1600 |
$* | 以一个单字符显示所有向脚本传递的参数 |
$@ | 以一个单字符显示所有向脚本传递的参数 |
$$ | 展现当前进程的ID号 |
$! | 展现后台运行进程的最后一个ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后的退出状态,0表示没有错误,其他数字表示有错误 |
实例:
echo "执行的文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "显示所有参数"$@""
echo "显示所有参数"$*""
echo "显示当前进程$$"
echo "显示Shell的当前选项$-"
[root@admin world]# ./demo03.sh 1 2 3
执行的文件名:./demo03.sh
第一个参数:1
第二个参数:2
第三个参数:3
显示所有参数1 2 3
显示所有参数1 2 3
显示当前进程26345
显示Shell的当前选项hB
@
和
@和
@和*的差别
"$@"会将输入的参数,变成多个字符
"$*"会将输入的参数变成一个字符
实例:
for i in "$@"
do
echo $i
done
for i in "$*"
do
echo $i
done
结果:
1
2
3
4
5
1 2 3 4 5