目录
一、简介
Shell 是一种命令行解释器,通常用于与操作系统进行交互。它允许用户通过输入命令来执行各种操作,如文件管理、进程控制、系统配置等。Shell 语言是一种脚本语言,用户可以编写脚本来执行一系列命令,从而自动化复杂的任务。
1、Shell 语言的主要特点
-
命令解释器:Shell 是一个命令解释器,它接收用户输入的命令并将其转换为操作系统可以理解的操作。
-
脚本语言:Shell 支持脚本编程,用户可以将一系列命令写入一个文件中,然后通过执行该文件来批量执行这些命令。
-
变量和参数:Shell 支持变量和参数的使用,用户可以在脚本中定义变量,并通过参数传递值。
-
条件判断和循环:Shell 提供了条件判断(如
if
语句)和循环(如for
和while
循环),使得脚本可以执行复杂的逻辑操作。 -
函数:Shell 支持函数的定义和调用,用户可以将一组命令封装在函数中,以便在脚本中重复使用。
-
内置命令和外部命令:Shell 提供了许多内置命令(如
cd
、pwd
、echo
等),同时也支持调用外部命令(如ls
、grep
等)。 -
管道和重定向:Shell 支持管道(
|
)和重定向(>
、<
、>>
),使得用户可以将一个命令的输出作为另一个命令的输入,或者将输出重定向到文件中。
2、常见的 Shell 类型
-
Bash(Bourne Again Shell):这是最常用的 Shell,是 GNU 项目的一部分,广泛用于 Linux 和 macOS 系统。Bash 是 Bourne Shell(sh)的增强版本,提供了更多的功能和改进。
-
sh(Bourne Shell):这是最早的 Unix Shell,功能相对简单,但仍然在许多系统中使用。
-
csh(C Shell):语法类似于 C 语言,提供了一些额外的功能,如命令历史和作业控制。
-
tcsh(TENEX C Shell):csh 的增强版本,提供了更多的功能和改进。
-
zsh(Z Shell):Bash 的替代品,提供了更多的功能和自定义选项,广泛用于高级用户和开发者。
3、Shell 脚本示例
以下是一个简单的 Shell 脚本示例,它将输出 "Hello, World!" 并显示当前目录的内容:
在shell文件开头第一行添加:#!/bin/bash 表示我们选择使用的shell解释器是bash,也可以用:#!/usr/bin/env bash
#!/bin/bash
# 输出 "Hello, World!"
echo "Hello, World!"
# 显示当前目录的内容
ls
4、执行shell脚本
-
输入脚本的绝对路径或相对路径
/root/hello.sh
./hello.sh
# 注意:执行的必须是一个可执行文件 chmod a+x xxx.sh
- bash或sh + 脚本
sh hello.sh
# 注意:当脚本没有X权限时,root和文件所有者通过该方式可以正常执行
-
在脚本的路径前再加"或source
source hello.sh
如何选择
-
如果需要修改当前 Shell 环境(如设置环境变量或定义函数),使用
source
或.
。 -
如果不需要修改当前 Shell 环境,且脚本文件有可执行权限,使用
./script.sh
。 -
如果不需要修改当前 Shell 环境,且脚本文件没有可执行权限,使用
bash script.sh
或sh script.sh
。
二、Shell语法
1、注释
- 单行注释
以 # 开头的行就是注释,会被解释器忽略
# 这是一行注释
- 多行注释
- 可以用多行#开头
-
# 这是一行注释 # 这是一行注释 # 这是一行注释 # 这是一行注释
-
多行注释 :<<
-
:<<EOF 注释内容... 注释内容... 注释内容... EOF # 在:<<后面的符号直到下次出现,之间的内容都是注释
2、 变量
-
语法:变量名=值
注意:等号左右两边不能有空格!
name="xiaoming"
-
变量的引用
name="xiaoming"
echo ${name}
# echo $name 也可以,不过建议加大括号
-
删除变量
name="xiaoming"
unset name
# 使用 unset 变量名 就可以消除变量
-
变量的命名规则
变量名的命令应该见名知意,同时遵循如下规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件名的命名最好在末尾加上拓展名
5、不要带有空格、?、*等特殊字符
6、不能使用bash中的关键字,例如if,for,while,do等
7、不要和系统环境变量冲突
变量使用场景
- 脚本运行时传值
#!/bin/bash
# 获取传递的参数
echo "第一个参数是: $1"
echo "第二个参数是: $2"
echo "第三个参数是: $3"
# 获取所有参数
echo "所有参数是: $@"
# 获取参数的个数
echo "参数个数是: $#"
运行
./script.sh arg1 arg2 arg3
- 用户交互传值
在Shell脚本中,可以通过
read
命令与用户进行交互,获取用户输入的值。
#!/bin/bash
# 提示用户输入
echo "请输入你的名字:"
read name
# 使用用户输入的值
echo "你好, $name!"
运行
./script.sh
3、常量
定义常量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
name="123"
readonly name