前言
Shell脚本是一种用来执行命令行命令的脚本文件。它是由一系列Shell命令组成的程序,通常用于自动化任务、系统管理、数据处理等。Shell脚本可以运行在各种Unix和Linux系统上,也可以在Windows上的一些兼容环境(如Cygwin、WSL)中运行。
组成部分
1、解释器声明:脚本文件的第一行通常是#!(称为shebang),后跟解释器路径,用于指定脚本运行时使用的解释器。例如,使用Bash解释器:
#!/bin/bash
2、命令:Shell脚本由一系列Shell命令组成,每个命令在脚本中独立执行。
echo "Hello, World!"
3、变量:可以定义和使用变量来存储数据。
NAME="John"
echo "Hello, $NAME"
4、控制结构:包括条件语句(if、case)、循环(for、while)。
if [ "$NAME" == "John" ]; then
echo "Hello, John!"
else
echo "Hello, $NAME!"
fi
5、函数等。
#!/bin/bash
# 定义函数
function greet {
echo "Hello, $1"
}
# 调用函数
greet "Alice"
greet "Bob"
三种执行方式的区别
1、./
- 用途:使用当前目录下的解释器来执行脚本或可执行文件。
- 解释器 :取决于脚本的第一行(shebang)指定的解释器。例如,如果脚本的第一行是
#!/bin/bash
,那么使用./myscript.sh
会执行myscript.sh
文件,并使用Bash作为解释器。 - 适用性:主要用于执行当前目录下的脚本或二进制文件,比如用户自定义的Shell脚本或者可执行文件。
- 权限要求 :使用
./
来执行脚本,必须确保脚本文件具有可执行权限。
2、bash
- 用途:显式地使用Bash解释器来执行脚本或命令。
- 解释器:强制使用Bash解释器执行。不管脚本的shebang是什么,都会使用Bash来解释执行脚本。
- 适用性:适合确保在不同系统上使用相同的Shell环境(Bash)来执行脚本,或者需要使用Bash特定功能的脚本。
- 权限要求 :使用
bash
命令来执行脚本,不需要脚本文件本身有可执行权限,只要用户对脚本文件有读权限即可。这是因为bash
命令会直接解释执行文件,而不依赖文件自身的可执行权限。
3、sh
- 用途:使用系统默认的Shell解释器来执行脚本或命令。
- 解释器:通常指向系统上的标准Shell(可能是Bourne Shell或其衍生版本),不一定是Bash。
- 适用性 :保证脚本在不同UNIX系统上的兼容性,因为大多数UNIX系统都会安装一个标准的Shell解释器,比如Bourne Shell (
sh
)或其替代品。 - 权限要求 :使用
sh
命令来执行脚本,同样不需要脚本文件本身有可执行权限,只要用户对脚本文件有读权限即可。sh
命令也会直接解释执行文件,不依赖文件自身的可执行权限。
概念
输出
echo:用于在终端上输出文本或变量的值
-e
:启用解释反斜杠转义字符。-n
:不在末尾添加换行符。-E
:禁用解释反斜杠转义字符(默认行为)。
当使用 -e
选项时,以下转义字符可以被解释:
-
\a
:警告(响铃) -
\b
:退格 -
\c
:抑制(不输出)其后的换行符 -
\e
:转义字符 -
\f
:换页 -
\n
:换行 -
\r
:回车 -
\t
:水平制表符 -
\v
:垂直制表符 -
\\
:反斜杠 -
\nnn
:八进制值 nnn(1 到 3 位数字) -
\xHH
:十六进制值 HH(1 到 2 位数字)#基础语法
echo "hello world!"#输出重定向到文件
echo "hello world!" > hello.txt#输出追加到文件末尾
echo "hello world!" >> hello.txt#输出变量值,会输出hello, Alice
name="Alice"
echo "hello, $name"#使用-e选项启用转义字符解释,有个换行符号,所以会输出 hello
world
echo -e "hello\nworld"
输入
read:用于从标准输入读取一行,并将输入赋值给一个或多个变量。
-
-p
:在读取输入前显示提示信息。 -
-r
:禁止反斜杠转义(原样读取输入)。 -
-n
:读取指定的字符数,而不是整行。 -
-s
:隐藏输入的字符(适用于输入密码)。 -
-t
:设置超时(秒),在超时后读取命令会自动退出。 -
-d
:设置定界符,默认是换行符。#读取一行输入并存储在一个变量中,回车结束输入
read name
echo "Hello, $name"#提示信息,使用 -p 选项在读取前显示提示信息
read -p "Enter your age: " age
echo "You are $age years old."#使用 -r 选项禁止反斜杠转义
read -r -p "Enter a file path: " filepath
echo "The file path is: $filepath"#一次性读取多于一个变量
echo "Enter your first name and last name:"
read firstname lastname
echo "Hello, $firstname $lastname"#设置读取字符数,使用 -n 选项读取指定数量的字符
read -n 4 -p "Enter a 4-digit PIN: " pin
echo "Your PIN is: $pin"#使用 -s 选项隐藏输入(适用于密码)
read -s -p "Enter your password: " password
echo
echo "Your password is stored securely."#设置超时,使用 -t 选项设置读取输入的超时时间(秒)
if read -t 5 -p "Enter your username (5 seconds timeout): " username; then
echo "Hello, $username"
else
echo "Timed out!"
fi#使用 -d 选项设置自定义的定界符(默认是换行符)
read -d ';' -p "Enter input terminated by ';': " input
echo "You entered: $input"#从文件中逐行读取输入
while read line; do
echo "Read line: $line"
done < input.txt
变量
普通变量
普通变量用于存储数据,在当前Shell会话或脚本中使用。
my_var="Hello, World!"
number=42
echo $my_var # 输出: Hello, World!
echo $number # 输出: 42
环境变量
环境变量是在当前Shell会话及其子进程中都可以使用的变量。它们通常用于配置系统和程序的行为。常见的环境变量:
·PATH
:指定可执行文件的搜索路径。
·HOME
:当前用户的主目录。
·USER
:当前登录的用户名。
·SHELL
:当前用户的默认Shell。
·PWD
:当前工作目录。
·OLDPWD
:前一个工作目录。
#设置环境变量
export MY_ENV_VAR="Some value"
echo $MY_ENV_VAR # 输出: Some value
#添加到PATH
export PATH="/my/custom/dir:$PATH"