Shell 教程
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
在线体验网站
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
第一个shell脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
输入一些代码,第一行一般是这样:
创建一个first.sh文件
vi first.sh
输入以下内容
#!/bin/bash
echo "Hello World !"
按i切换模式,然后输入内容,再按esc返回,按shift+: ,输入wq保存退出。
不懂操作vi的就返回去看
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
然后我们cat查看first.sh的文件内容
运行 Shell 脚本有两种方法:
1、作为可执行程序
chmod +x ./first.sh #使脚本具有执行权限
用ll 查看
./first.sh #执行脚本
注意,一定要写成 ./first.sh,而不是 first.sh,运行其它二进制的程序也一样,直接写 first.sh,linux 系统会去 PATH 里寻找有没有叫 first.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./first.sh 告诉系统说,就在当前目录找。
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
Shell 变量
在 Shell 编程中,变量是用于存储数据值的名称。
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="baoge"
案例:
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
1.只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
2.不能以数字开头: 变量名不能以数字开头,但可以包含数字。
3.避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
4.使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
5.避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
6.避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
有效的 Shell 变量名示例如下:
在原来first.sh文件操作
vi first.sh
NOOB="www.baidu.com"
LD_PATH="/bin/"
_var="123"
var2="zhangsan"
案例:
运行结果
无效的变量命名:
# 避免使用if作为变量名
if="some_value"
# 避免使用 $ 等特殊符号
variable_with_$=42
?var=123
user*name=runoob
# 避免空格
variable with space="value"
等号两侧避免使用空格:
# 正确的赋值
variable_name=value
# 有可能会导致错误
variable_name = value
使用变量方法
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="baoge"
echo $your_name
echo ${your_name}
推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom"
echo $your_name
your_name="baoge"
echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写 y o u r n a m e = " a l i b a b a " ,使用变量的时候才加美元符( your_name="alibaba",使用变量的时候才加美元符( yourname="alibaba",使用变量的时候才加美元符()。
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myurl="www.baidu.com"
readonly myUrl
myurl="www.baoge.com"
案例
运行脚本,结果如下:
删除变量
使用 unset 命令可以删除变量。语法:
新建 txt.sh文件
vi txt.sh
chmod +x ./txt.sh #使脚本具有执行权限
#!/bin/sh
name="zhangsan"
unset name
echo ${name}
变量被删除后不能再次使用。unset 命令不能删除只读变量。
案例
以上实例执行将没有任何输出。
课后练习
实操题一:Shell 脚本创建与运行
-
题目要求:
- 使用
vi
或vim
编辑器创建一个名为greeting.sh
的 Shell 脚本文件。 - 在脚本中,使用
echo
命令输出 “Today is a nice day!”。 - 设置该脚本的执行权限,并使用两种运行方式(作为可执行程序和作为解释器参数)运行该脚本,观察输出结果。
- 使用
-
操作步骤参考:
- 打开终端,输入
vi greeting.sh
进入vi
编辑器。 - 按下
i
键进入插入模式,输入以下内容:
- 打开终端,输入
#!/bin/bash
echo "Today is a nice day!"
3. 按下 `esc` 键退出插入模式,然后输入 `:wq` 保存并退出 `vi` 编辑器。
4. 给脚本添加执行权限:`chmod +x greeting.sh`。
5. 作为可执行程序运行:`./greeting.sh`。
6. 作为解释器参数运行:`/bin/sh greeting.sh`。
实操题二:Shell 变量操作
-
题目要求:
- 创建一个名为
var_operation.sh
的 Shell 脚本文件。 - 在脚本中定义一个变量
num
,并赋值为5
。 - 输出变量
num
的值。 - 将变量
num
的值重新定义为10
,再次输出变量num
的值。 - 尝试将变量
num
定义为只读变量,然后再尝试重新赋值,观察结果。
- 创建一个名为
-
操作步骤参考:
- 打开终端,输入
vi var_operation.sh
进入vi
编辑器。 - 按下
i
键进入插入模式,输入以下内容:
- 打开终端,输入
#!/bin/bash
num=5
echo "The value of num is: $num"
num=10
echo "The new value of num is: $num"
readonly num
num=15 # 此行会导致错误
3. 按下 `esc` 键退出插入模式,然后输入 `:wq` 保存并退出 `vi` 编辑器。
4. 运行脚本:`./var_operation.sh`,观察输出结果以及错误提示(因为尝试修改只读变量)。
实操题三:综合运用 Shell 脚本与变量
-
题目要求:
- 创建一个名为
user_info.sh
的 Shell 脚本文件。 - 定义变量
name
为自己的姓名,变量age
为自己的年龄,变量hobby
为自己的爱好(均使用合适的变量名)。 - 在脚本中使用
echo
命令输出以下格式的信息:“My name is [姓名], I’m [年龄] years old and I like [爱好].” - 尝试删除变量
age
,然后再次输出上述信息,观察结果。
- 创建一个名为
-
操作步骤参考:
- 打开终端,输入
vi user_info.sh
进入vi
编辑器。 - 按下
i
键进入插入模式,输入以下内容:
- 打开终端,输入
#!/bin/bash
name="Your Name"
age=25
hobby="Reading"
echo "My name is $name, I'm $age years old and I like $hobby."
unset age
echo "My name is $name, I'm $age years old and I like $hobby."
3. 将 `name`、`age` 和 `hobby` 的值替换为自己的真实信息。
4. 按下 `esc` 键退出插入模式,然后输入 `:wq` 保存并退出 `vi` 编辑器。
5. 运行脚本:`./user_info.sh`,观察输出结果中第二次输出时年龄部分的变化(因为已删除该变量)。