Shell
目录
一、Shell是什么?
Shell 是一种用于与操作系统交互的命令行解释器和脚本语言。
它是用户和操作系统内核之间的接口,允许用户输入命令并将其发送到操作系统以执行。
Linux系统提供了多种Shell解析器,其中一些最常见的包括:
1.Bash(Bourne Again Shell):
- Bash是Linux系统中最常用的Shell解析器之一,也是默认的Shell。
- 它是Bourne Shell(sh)的增强版本,具有更多功能和扩展,支持命令自动补全、历史命令记录、作业控制等特性。
2.Zsh(Z Shell):
- Zsh是一个功能丰富的Shell解析器,提供了许多高级功能,如强大的自动补全、主题和插件系统、高级别的配置选项等。
- 它在用户友好性和定制性方面比Bash更加强大。
3.Fish(Friendly Interactive Shell):
- Fish是一个用户友好的交互式Shell,具有语法高亮、智能命令补全、简洁的语法等特性。
- Fish的设计旨在提供更直观和易用的命令行体验。
4.Ksh(Korn Shell):
- Ksh是由David Korn开发的Shell解析器,具有与Bash类似的语法和功能。
- 它是商业Unix系统中常见的Shell之一,但在Linux中也可用。
5.Dash:
- Dash是一个轻量级的Shell解析器,专注于执行脚本时的快速启动和执行。
- 在一些Linux发行版中,Dash被用作/bin/sh的符号链接,用于提高系统启动和脚本执行的性能。
二、Shell怎么使用?
1.变量
变量的命名和赋值
在 Shell 中,变量的命名遵循以下规则:
- 变量名由字母、数字和下划线组成,但不能以数字开头。
- 变量名区分大小写。
- 通常使用大写字母命名环境变量,使用小写字母命名用户自定义变量。
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的赋值使用等号 =
,如下所示:
variable_name=value
在赋值时,等号两侧不需要空格。
例如:
name="yushifu"
age=23
变量类型
字符串变量:存储文本数据。
数字变量:存储数值数据,可以进行算术运算。
数组变量:存储多个值的有序集合,可以通过索引来访问。
#定义字符串变量
my_string="Hello, World!"
定义数字变量
my_number=42
定义数组变量
my_array=("apple" "banana" "orange")
变量的作用域
在Shell脚本中,变量的作用域分为全局变量和局部变量。
默认情况下,变量都是全局的,可以在脚本的任何位置访问。
但是在函数内部定义的变量通常是局部的,只在函数内部有效。
只读变量
可以使用 readonly
命令将变量设置为只读,之后无法修改变量的值:
readonly name="yushifu"
readonly变量,注意:不能unset。
删除变量
可以使用 unset
命令删除变量:
unset name
环境变量
Shell 还支持环境变量,它们对整个系统或用户会话可见。可以使用 export
命令将变量导出为环境变量:
export PATH="/usr/local/bin:$PATH"
系统预定义变量
常用系统变量
$HOME、$PWD、$SHELL、$USER等
(1)查看系统变量的值。
[shells]$ echo $HOME
/home/yushifu
(2)显示当前Shell中所有变量:set。
[shells]$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
变量的使用
要在 Shell 脚本中引用变量的值,可以使用 $
符号,或者使用 ${}
进行包裹,如下所示:
echo "Hello, $name" # 输出 Hello,yushifu
echo "he is ${age} years old" # 输出 he is 23 years old
- 定义变量A。
[shells]$ A=5
[shells]$ echo $A
5
- 给变量A重新赋值。
[shells]$ A=8
[shells]$ echo $A
8
- 撤销变量A。
[shells]$ unset A
[shells]$ echo $A
- 声明静态的变量B=2,不能unset。
[shells]$ readonly B=2
[shells]$ echo $B
2
[shells]$ B=9
-bash: B: readonly variable
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
[shells]$ C=1+2
[shells]$ echo $C
1+2
- 变量的值如果有空格,需要使用双引号或单引号括起来。
[shells]$ D=I love banzhang
-bash: world: command not found
[shells]$ D="I love banzhang"
[shells]$ echo $D
I love banzhang
- 可把变量提升为全局环境变量,可供其他Shell程序使用。
export 变量名
[shells]$ vim helloworld.sh
在helloworld.sh文件中增加echo $B。
#!/bin/bash
echo "helloworld"
echo $B
[shells]$ ./helloworld.sh
Helloworld
发现并没有打印输出变量B的值。
[shells]$ export B
[shells]$ ./helloworld.sh
helloworld
2
- 使用字符串拼接操作符 += 或者直接将变量连接在一起。
定义两个字符串变量
first_name="John"
last_name="Doe"
使用字符串拼接操作符 +=
full_name="$first_name"
full_name+=" $last_name"
输出拼接后的字符串
echo "Full name: $full_name"
直接将变量连接在一起:
定义两个字符串变量
first_name="John"
last_name="Doe"
将两个变量连接在一起
full_name="$first_name $last_name"
输出拼接后的字符串
echo "Full name: $full_name"
- 使用 ${} 来进行字符串的替换或者使用命令替换。
单次替换:
定义一个字符串变量
my_string="Hello, World!"
将 "Hello" 替换为 "Hi"
new_string="${my_string/Hello/Hi}"
输出替换后的字符串
echo "$new_string"
全局替换:
定义一个字符串变量
my_string="Hello, World! Hello, Universe!"
将所有的 "Hello" 替换为 "Hi"
new_string="${my_string//Hello/Hi}"
输出替换后的字符串
echo "$new_string"
删除匹配的字符串:
定义一个字符串变量
my_string="Hello, World!"
删除所有的 "l" 字符
new_string="${my_string//l/}"
输出删除后的字符串
echo "$new_string"
在匹配的字符串前缀进行替换:
定义一个字符串变量
my_string="Hello, World!"
将以 "Hello" 开头的部分替换为 "Hi"
new_string="${my_string/#Hello/Hi}"
输出替换后的字符串
echo "$new_string"
在匹配的字符串后缀进行替换:
定义一个字符串变量
my_string="Hello, World!"
将以 "World!" 结尾的部分替换为 "Universe!"
new_string="${my_string/%World!/Universe!}"
输出替换后的字符串
echo "$new_string"
- 使用 ${array[@]} 和 ${#array[@]} 等操作数组。
在Shell中,可以使用 ${array[@]} 来引用数组的所有元素,并使用 ${#array[@]} 来获取数组的长度。
引用数组的所有元素:
# 定义一个数组
my_array=("apple" "banana" "orange")
# 使用 ${array[@]} 引用数组的所有元素
echo "Fruits: ${my_array[@]}"
${my_array[@]} 会将数组 my_array 中的所有元素作为一个整体引用,以空格分隔。
获取数组的长度:
# 定义一个数组
my_array=("apple" "banana" "orange")
# 使用 ${#array[@]} 获取数组的长度
array_length="${#my_array[@]}"
# 输出数组的长度
echo "Length of array: $array_length"
遍历数组元素:
# 定义一个数组
my_array=("apple" "banana" "orange")
# 使用 for 循环遍历数组
echo "Fruits:"
for fruit in "${my_array[@]}"; do
echo "- $fruit"
done
特殊变量和位置参数
$n
1)基本语法
$n
(功能描述:n为数字,$0代表该脚本名称,$1- $9
代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
。)
[shells]$ touch parameter.sh
[shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
[atguigu@hadoop101 shells]$ chmod 777 parameter.sh
[atguigu@hadoop101 shells]$ ./parameter.sh yu shifu
==========$n==========
./parameter.sh
yu
shifu
$#
1)基本语法
$#
(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。
[shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
[shells]$ chmod 777 parameter.sh
[shells]$ ./parameter.sh yu shifu
==========$n==========
./parameter.sh
yu
shifu
==========$#==========
2
$*、$@
1)基本语法
$*
(功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体)
$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待)
[shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
echo '==========$*=========='
echo $*
echo '==========$@=========='
echo $@
[shells]$ ./parameter.sh a b c d e f g
==========$n==========
./parameter.sh
a
b
==========$#==========
7
==========$*==========
a b c d e f g
==========$@==========
a b c d e f g
$?
1)基本语法
$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了)
判断helloworld.sh脚本是否正确执行。
[shells]$ ./helloworld.sh
hello world
[shells]$ echo $?
0
2.运算符
1)基本语法
“$((运算式))” 或 “$[运算式]”
# 定义两个数
num1=10
num2=5
# 加法
result=$((num1 + num2))
echo "Addition: $result"
# 减法
result=$((num1 - num2))
echo "Subtraction: $result"
# 乘法
result=$((num1 * num2))
echo "Multiplication: $result"
# 除法
result=$((num1 / num2))
echo "Division: $result"
# 取模
result=$((num1 % num2))
echo "Modulus: $result"
3.条件判断
1)基本语法
(1)test condition
(2)[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ yushifu ] 返回true,[ ] 返回false。
2)常用判断条件
(1)两个整数之间比较
-eq 等于(equal)
-ne 不等于(not equal)
-lt 小于(less than)
-le 小于等于(less equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
- 两个整数之间比较
# 比较两个整数
num1=10
num2=20
if [ $num1 -eq $num2 ]; then
echo "num1 is equal to num2"
fi
if [ $num1 -ne $num2 ]; then
echo "num1 is not equal to num2"
fi
if [ $num1 -lt $num2 ]; then
echo "num1 is less than num2"
fi
if [ $num1 -le $num2 ]; then
echo "num1 is less than or equal to num2"
fi
if [ $num1 -gt $num2 ]; then
echo "num1 is greater than num2"
fi
if [ $num1 -ge $num2 ]; then
echo "num1 is greater than or equal to num2"
fi
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
实例
# 检查文件权限
file="/path/to/file"
if [ -r $file ]; then
echo "File is readable"
fi
if [ -w $file ]; then
echo "File is writable"
fi
if [ -x $file ]; then
echo "File is executable"
fi
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
实例
# 检查文件类型
file="/path/to/file"
if [ -e $file ]; then
echo "File exists"
fi
if [ -f $file ]; then
echo "File is a regular file"
fi
if [ -d $file ]; then
echo "File is a directory"
fi
4.流程控制
if判断
1)基本语法
(1)单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
-----------------------------------------------------------
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
① [ 条件判断式 ],中括号和条件判断式之间必须有空格
② if后要有空格
实例
单分支
# 示例1: 单分支,使用then on the same line
if [ $age -ge 18 ]; then
echo "You are an adult."
fi
# 示例2: 单分支,使用then on a new line
if [ $temperature -gt 20 ]
then
echo "It's a nice day!"
fi
多分支
# 示例3: 多分支
if [ $grade == "A" ]
then
echo "Excellent!"
elif [ $grade == "B" ]
then
echo "Good!"
else
echo "Work harder!"
fi
1.在条件判断式的方括号 [ ] 与具体的条件之间需要有空格。
2.if 后面有一个空格。
3.在单分支和多分支结构中,then 可以与 if 写在同一行,也可以另起一行,取决于编码风格和个人偏好。
case语句
case 语句在 Shell 脚本中用于根据不同的情况执行不同的代码块。它的语法结构如下:
case expression in
pattern1)
# 在满足 pattern1 时执行的代码
;;
pattern2)
# 在满足 pattern2 时执行的代码
;;
patternN)
# 在满足 patternN 时执行的代码
;;
*)
# 默认情况下执行的代码,类似于 switch 语句中的 default 分支
;;
esac
1.expression 是要被匹配的值或变量。
2.pattern1、pattern2、patternN 是用于匹配 expression 的模式。每个模式后面跟着一个圆括号 ( )。
3.;; 是每个模式执行完毕时的标志,类似于 case 语句中的 break。
4.*) 是一个通配符,表示如果没有任何模式匹配,则执行 *) 后面的代码块。
示例
#!/bin/bash
# 定义一个变量
fruit="apple"
# 使用 case 语句判断水果类型
case $fruit in
apple)
echo "It's an apple."
;;
banana)
echo "It's a banana."
;;
orange)
echo "It's an orange."
;;
*)
echo "It's something else."
;;
esac
在这个例子中,根据变量 fruit 的值,case 语句匹配相应的模式,并执行相应的代码块。如果 fruit 的值不匹配任何模式,那么就执行 *) 后面的代码块。
case 语句在需要根据多种情况进行不同处理时非常有用,它比多个 if-elif-else 结构更加简洁。
for循环
for 循环在 Shell 脚本中用于遍历一个列表或者数组中的元素,并执行相应的操作。它的基本语法结构如下:
for item in [list]
do
# 在这里执行操作,可以使用 $item 变量来引用当前迭代的元素
done
1.item 是用于遍历列表中每个元素的临时变量。
2.[list] 是要遍历的列表,可以是一系列字符串、文件名、数组等。
示例:
#!/bin/bash
# 定义一个数组
fruits=("apple" "banana" "orange" "grape")
# 使用 for 循环遍历数组中的每个元素
for fruit in "${fruits[@]}"
do
echo "I like $fruit"
done
for 循环遍历了数组 fruits 中的每个元素,并将每个元素赋值给变量 fruit,然后在循环体中打印出相应的语句。
除了遍历数组,for 循环也可以用来遍历一个范围内的数字。例如:
#!/bin/bash
# 使用 for 循环打印数字 1 到 5
for num in {1..5}
do
echo "Number: $num"
done
这将打印出数字 1 到 5。
Tips:比较$*
和$@
区别。
$*
和$@
都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n
的形式输出所有参数。
当它们被双引号“”包含时,$*
会将所有的参数作为一个整体,以“$1 $2 …$n”
的形式输出所有参数;$@
会将各个参数分开,以“$1” “$2”…“$n”
的形式输出所有参数。
while循环
while 循环在 Shell 脚本中用于在给定条件为真时重复执行一系列命令。其基本语法结构如下:
while [ condition ]
do
# 在这里执行操作,直到条件为假
done
1.condition 是一个表达式,通常是一个测试命令(如 test 或 [)的条件。只要 condition 为真,循环就会继续执行。
2.循环体中的命令将一直执行,直到 condition 变为假为止。
示例
#!/bin/bash
# 初始化计数器
count=1
# 使用 while 循环打印数字 1 到 5
while [ $count -le 5 ]
do
echo "Count: $count"
# 增加计数器
((count++))
done
while 循环会持续执行,直到 $count 的值超过 5。每次循环迭代时,计数器 $count 的值会递增,并打印出当前的计数值。
while 循环通常用于处理需要反复执行直到某个条件满足的情况,例如处理文件行或其他迭代操作。与 for 循环相比,while 循环更灵活,因为它可以根据条件的变化来动态控制循环的执行次数。
5.读取控制台输入
在 Shell 脚本中,read
命令用于从标准输入(通常是控制台)读取用户输入,并将其存储到一个变量中。
这个命令在编写需要与用户进行交互的脚本时非常有用,例如要求用户输入信息或确认操作。
read 命令的基本语法如下:
read [options] variable_name
1.options 是一些用于控制 read 命令行为的选项,例如超时时间等(可选)。
2.variable_name 是存储用户输入的变量名。
以下是一些 read 命令的常用选项:
3.-p prompt_text:显示提示信息 prompt_text,然后等待用户输入。
4.-r:防止对输入行进行反斜杠转义处理。
5.-s:在用户输入时不回显(即不显示输入的内容),常用于输入密码等敏感信息。
示例,如何使用 read 命令读取用户输入:
#!/bin/bash
# 提示用户输入姓名
echo "Please enter your name:"
read name
# 提示用户输入密码,且不回显输入内容
echo "Please enter your password:"
read -s password
# 输出用户输入的姓名和密码
echo "Hello, $name! Your password is: $password"
脚本会提示用户输入姓名和密码,并且密码输入时不会在屏幕上显示。然后,脚本会将用户输入的姓名和密码输出到控制台上。
6.函数
系统函数
Shell脚本中的系统函数常指的是一系列内置的命令和工具,它们允许脚本与操作系统进行交互,并执行各种任务,如文件操作、字符串处理、系统管理等。
文件和目录操作:
cp:用于复制文件或目录。例如:cp file1 file2 将文件 file1 复制到 file2。
mv:用于移动文件或目录。例如:mv file1 file2 将文件 file1 移动到 file2。
rm:用于删除文件或目录。例如:rm file1 将删除名为 file1 的文件。
mkdir:用于创建目录。例如:mkdir directory 将在当前目录下创建一个名为 directory 的目录。
rmdir:用于删除目录。例如:rmdir directory 将删除名为 directory 的目录(如果目录为空)。
touch:用于创建空文件或更新文件的访问和修改时间。例如:touch file1 将创建一个名为 file1 的空文件。
cat:用于连接文件或标准输入并打印到标准输出。例如:cat file1 将打印 file1 文件的内容。
echo:用于打印文本或变量到标准输出。例如:echo "Hello, world!" 将打印字符串 "Hello, world!"。
grep:用于在文件中搜索匹配的文本行。例如:grep "pattern" file1 将在 file1 中搜索包含 "pattern" 的行。
sed:用于基于正则表达式进行文本替换和处理。例如:sed 's/old/new/g' file1 将在 file1 中将所有 old 替换为 new。
awk:用于处理文本和数据流的强大工具。例如:awk '{print $1}' file1 将打印 file1 中每行的第一个字段。
系统管理:
ps:用于列出当前运行的进程。例如:ps -aux 将显示所有进程的详细信息。
top:用于显示运行中的进程和系统资源使用情况。例如:top 将显示当前系统资源使用情况和进程列表。
kill:用于终止进程。例如:kill PID 将终止进程ID为 PID 的进程。
shutdown:用于关闭或重启系统。例如:shutdown -r now 将立即重启系统。
环境变量和用户信息:
env:用于显示环境变量。例如:env 将显示当前所有的环境变量。
export:用于设置环境变量。例如:export PATH=$PATH:/new/path 将向 PATH 环境变量中添加新路径。
whoami:用于显示当前用户名。例如:whoami 将显示当前登录用户的用户名。
hostname:用于显示系统主机名。例如:hostname 将显示当前系统的主机名。
日期和时间:
date:用于显示或设置系统日期和时间。例如:date 将显示当前日期和时间。
Tips:
1.basename:
basename 命令用于从给定的路径中提取文件名部分。
语法:basename path [suffix]
参数 path 是要提取文件名的路径。
可选参数 suffix 是要移除的文件后缀,如果不提供,则会返回完整的文件名。
示例:
basename /path/to/file.txt # 输出: file.txt
basename /path/to/file.txt .txt # 输出: file
2.dirname:
dirname 命令用于从给定的路径中提取目录名部分。
语法:dirname path
参数 path 是要提取目录名的路径。
示例:
bash
dirname /path/to/file.txt # 输出: /path/to
3.cut:
通常用于从文本文件或标准输入中提取特定字段或字符。
基本语法:
cut OPTION... [FILE]...
其中,OPTION 是一些用于指定切割条件的参数,FILE 是要处理的文件名。如果不指定 FILE,cut 将从标准输入读取数据。
常见的 cut 命令选项包括:
-f, --fields=LIST:指定要提取的字段列表。
-d, --delimiter=DELIM:指定字段的分隔符,默认为制表符。
-c, --characters=LIST:指定要提取的字符列表。
-complement:补集,提取除指定字段/字符外的内容。
-s, --only-delimited:仅显示包含分隔符的行。
示例:
提取文件中的字段:
# 提取第一列
cut -f1 file.txt
# 提取第一列和第三列
cut -f1,3 file.txt
# 使用逗号作为分隔符
cut -d',' -f1,3 file.csv
提取文件中的字符:
# 提取前5个字符
cut -c1-5 file.txt
# 提取第3个字符到文件末尾
cut -c3- file.txt
补集:
# 提取除第一列以外的所有列
cut -f1 --complement file.txt
cut 命令非常适合用于对文本数据进行快速的字段提取和处理,特别是在处理 CSV 文件或者需要分析文本数据时。
4.awk:
在Shell脚本中,awk 是一个强大的文本处理工具,它允许用户根据特定的模式进行逐行处理和操作文本数据。
语法:
awk 'pattern { action }' file
其中,pattern 是一个模式,用于匹配要处理的文本行,action 是一个动作,用于对匹配的行执行操作。
file 是要处理的文件名,如果未指定文件名,则 awk 将从标准输入读取数据。
awk 可以完成各种文本处理任务,包括过滤、格式化、计算等。
1.打印指定列:
awk '{ print $1 }' file.txt
这将打印文件 file.txt 的第一列。
2.打印满足条件的行:
awk '/pattern/ { print }' file.txt
这将打印文件 file.txt 中包含 pattern 的所有行。
3.计算列的总和:
awk '{ sum += $1 } END { print sum }' file.txt
这将计算文件 file.txt 中第一列的总和,并将结果打印出来。
4.自定义分隔符:
awk -F',' '{ print $1 }' file.csv
这将以逗号作为分隔符处理 file.csv 文件。
5.自定义输出格式:
awk '{ printf "Name: %s, Age: %d\n", $1, $2 }' file.txt
这将按照指定的格式输出文件 file.txt 中的数据。
awk 还支持更复杂的逻辑和操作,包括条件判断、循环等。它的强大之处在于可以在一行命令中完成许多常见的文本处理任务,使得它成为处理结构化文本数据的强大工具。
后续会继续补充~
自定义函数
自定义函数是Shell脚本中的一种重要特性,允许开发者将一系列命令组织在一起,并为其指定一个名称,以便在脚本中重复使用。通过自定义函数,可以提高脚本的可读性、可维护性和复用性。
1.定义函数:
在Shell脚本中,使用 function 关键字或者简单地在函数名之前直接写函数名,来定义一个函数。函数的语法如下:
function_name() {
# 函数体,包含一系列命令
}
或者:
function_name {
# 函数体,包含一系列命令
}
例如:
# 定义一个简单的打印欢迎消息的函数
welcome() {
echo "Welcome to my blog!"
}
2.调用函数:
要调用自定义函数,只需在脚本中使用函数名称即可。例如,对于上面定义的 welcome 函数,可以这样调用它:
welcome
3.传递参数:
函数可以接受参数,在函数内部使用特殊变量 $1、$2 等来访问传递给函数的参数。例如:
greet() {
echo "Hello, $1!"
}
greet "yushifu"
这将输出:Hello, yushifu!
4.返回值:
函数可以通过 return 语句返回一个值给调用者。例如:
add() {
local result=$(( $1 + $2 ))
return $result
}
add 3 5
sum=$?
echo "Sum: $sum"
这将输出:Sum: 8
Tips:
- (1)在调用函数地方之前,必须先声明函数。shell脚本是逐行运行,不会像其它语言一样先编译。
- (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)。
7.正则表达式
在Shell脚本中,正则表达式常用于文本处理,包括匹配、查找、替换等操作。
.
:匹配任意单个字符,除了换行符。
示例:a.c 可以匹配 abc、adc、a1c 等。
*
:匹配前一个字符的零个或多个实例。
示例:a* 可以匹配 a、aa、aaa 等。
+
:匹配前一个字符的一个或多个实例。
示例:a+ 可以匹配 a、aa、aaa 等,但不能匹配空字符串。
?
:匹配前一个字符的零个或一个实例。
示例:a? 可以匹配 a 或空字符串。
[ ]
:匹配括号内的任意一个字符。
示例:[abc] 可以匹配 a、b 或 c。
[6,8]------匹配6或者8
[0-9]------匹配一个0-9的数字
[0-9]*------匹配任意长度的数字字符串
[a-z]------匹配一个a-z之间的字符
[a-z]* ------匹配任意长度的字母字符串
[a-c, e-f]-匹配a-c或者e-f之间的任意字符
[^]
:否定匹配,匹配除了括号内指定字符之外的任意字符。
示例:[^abc] 可以匹配除了 a、b、c 之外的任意字符。
^
:匹配行的开头。
示例:^abc 匹配以 abc 开头的行。
$
:匹配行的结尾。
示例:abc$ 匹配以 abc 结尾的行。
\
:转义字符,用于匹配特殊字符。
示例:\. 可以匹配点号 .。
()
:分组,用于限定匹配范围。
示例:(abc)+ 可以匹配 abc、abcabc、abcabcabc 等。
标签:Shell,变量,name,shells,echo,详解,file,脚本语言 From: https://blog.csdn.net/weixin_48935611/article/details/139420494