1.shell简介
1.1 什么是shell
什么是shell呢?shell是用C语言编写的程序,它是用户使用 Linux 的桥梁。Shell既是一种命令语言,又是一种程序设计语言。简单来说Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。也可以这样认为,linux中的shell就是linux内核的一个外层保护工具,并负责完成用户与内核之间的交互
1.2 shell脚本
shell脚本就是一种专门使用shell编写的脚本程序,它虽然没有C++、Java、Python等一系列高级语言功能强大,但是在服务器运维领域以及嵌入式开发领域,shell脚本具有举足轻重的地位。
shell脚本编程如同其他编程语言的一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以运行了,而linux下的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)
- … …
在诸多linux发行版系统中,最常用的就是Bash,就是Bourne Again Shell,因为其能工提供环境变量以配置用户shell环境,支持历史记录、内置算数功能、支持通配符表达式等高效性能,将linux常用命令进行的简化,被广泛应用于Debian系列的linux发行版中。
1.3 运行shell脚本
运行shell脚本的方法有两种:
- 作为可执行程序运行
- 作为解释器参数运行
shell脚本编写如下,并将其保存为test.sh,进入存放此文件目录
-
#!/bin/bash
-
echo "Hello World"
-
当作为可执行程序运行时候
-
-
chmod +x test.sh # 赋予可执行权限
-
./test.sh # 执行程序
-
-
当作为解释器参数运行时
-
-
/bin/sh test.sh # 执行命令
-
/bin/php test.php # 执行命令
-
1.4 shell注释
-
单行注释:和python注释相同,以
#
号开头作为单行注释-
# 这是一个注释
-
# author:ohuohuoo
-
# date:`date`
-
-
多行注释:如果在开发过程中,,遇到大段的代码需要临时注释起来,过一会儿又取消注释,可以将其定义为一个花括号的注释函数,也可以用多行注释
-
-
:<<EOF
-
注释内容...
-
注释内容...
-
注释内容...
-
EOF
-
# EOF可以换成其他符号
-
:<<E!
-
注释内容...
-
注释内容...
-
注释内容...
-
!
-
1.5 shell编写的基本步骤
- 建立shell文件
- 赋予shell文件可执行程序权限(使用chmod命令修改权限)
- 执行shell文件(直接运行赋予权限后的二进制文件)
2.shell变量
2.1 命名变量
shell编程中,定义变量是直接定义的,没有明确的数据类型,shel允许用户建立变量存储数据,但是将认为赋给变量的值都解释为一串字符,如下
-
cout=1 # 定义变量
-
name="ohuohuo" # 定义变量
-
echo $cout # 取变量值
-
echo $name # 取变量值
shell中,英文符号"$"
用于取变量值
注意点:shell编程的变量名的命名和其他语言一样,需要遵循一定的规则,规则如下
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
如下所示
-
有效的命令
-
-
NAME
-
LIBRARY_PATH
-
_var
-
var2
-
-
无效的命名
-
-
?var=123
-
user*name=ohuohuo
-
如果在变量中使用系统命令,需要加上 " `"符号(ESC键下方),如下所示
-
-
DATE1=`date`
-
DATE2=$(date)
- 1
- 2
两者功能相同
-
2.2 使用变量
使用变量的时,用英文符号"$"
取变量值,对于较长的变量名,建议加上{ }
花括号,帮助解释器识别变量的边界,如下
-
name="test_name"
-
echo "My name is ${name}and you"
- 1
- 2
加上方括号时即所有便后面的语句不留空格,shell也会自动识别边界,默认添加一个空格
此外,已经定义过的变量,可以二次定义并重新被赋值覆盖上一次的变量值,这点如同其他语言
2.3 变量类型
shell编程中也同样存在变量类型,在运行shell时会同时存在三种变量
- 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量
- shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,不同类型的变量保证了shell的正常运行
2.4 变量操作
shell中的变量,默认为可读可写类型,如果想要其只可读,如同url一样,需要将其声明为**只读类型变量(**如同const
),使用readonly
命令,如下脚本
-
#!/bin/bash
-
Url="http://www.baidu.com"
-
readonly Url
-
Url="http://www.csnd.net"
这样的话,这句就会报错,提示/bin/sh: NAME: This variable is read only.
此变量为只读变量
如果想要删除变量,使用unset
命令解除命令赋值,但是unset
不能删除可读变量,如下所示
-
#!/bin/sh
-
name="ohuohuo"
-
Url="http://www.baidu.com"
-
readonly Url # 设置可读变量
-
unset name # 可以被删除
-
unset Url # 不可被删除
-
echo $name # 不被打印出
-
echo $Url # 打印出
3.shell字符串
3.1 字符串类型
在shell中字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
使用单引号
使用单引号的不足:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
使用双引号
-
name="ohouhuoo"
-
str="please input your \"$name"\"
-
echo -e $str
输出结果如下图
使用双引号的优势:
- 可以在双引号中使用变量
- 可以在双引号中使用转移字符
由此可见,双引号较单引号而言有更强大的优势
3.2 字符串操作
-
获取字符串长度:在对变量进行取值时,使用" # "符号对字符串进行取值
-
-
string="abcd"
-
echo ${#string} # 输出 4
-
-
提取子字符串:使用字符串的截取命令,用于提取部分字符串
-
-
string="this is a test"
-
echo ${string:2:6} # 表示从第3个字符开始截取
- 1
- 2
上式输出结果为
is is
,如下图 -
-
查找字符串:用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找
it
中i
和t
两个字符,t
先出现,输出为1 -
-
string="this is a test"
-
echo `expr index "$string" it` # 输出 1
-