超详细!Linux入门之手把手教你shell脚本编程(字符串环境变量运算符)

Posted 你永远不了解Thrash的魅力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超详细!Linux入门之手把手教你shell脚本编程(字符串环境变量运算符)相关的知识,希望对你有一定的参考价值。

目录

一、shell

二、shell脚本的编写

1.建立一个新的shell脚本

(1)新建脚本

(2)指定执行环境

 (3)脚本的说明信息

 (4)脚本的执行

 (5)脚本的调式

三、变量的使用

1. 变量命名

2. 常用变量

3. 举例

四、字符串的操作

1. 字符串操作(长度,读取,替换)

2. 字符串操作举例

a) 计算字符串长度

b) 截取字串

c) 字符串删除

d) 字符串替换

五、 脚本的创建和执行

1) shell脚本的建立

2) 脚本开头(第一行)

3) 脚本注释

4) 举例

六、环境变量的使用

1. 知识点详解

定义变量的规则

将命令的返回值赋给变量(重点)

设置环境变量的基本语法:

2. 操作详解

脚本路径安装举例

七、数学运算

1. 知识点详解

2. 操作详解

八、脚本与用户交互

操作命令行参数

1.  读取参数

2 读取程序名

3 特殊变量

4 基本的读取

九、关系运算符

1. 知识点详解

2. 操作详解

十、字符串运算符

1. 知识点详解

2. 操作详解

测试结果:​

十一、shell文件及目录常用操作的几个实例

提取路径的目录和文件名 提取目录:

提取文件名:

批量重命名带有空格文件

遍历文件内容

文件不存在,则创建文件

递归遍历目录

清空文件内容


 

 

一、shell

什么是shell
shell也是操作系统中的一个软件,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口,系统中的命令用shell去解释shell接收系统回应的输出并显示到屏幕中bash=GNU Bourne-Again Shell
什么是shell脚本
脚本是一种解释型语言,用shell脚本保存执行动作,用脚本判定命令的执行条件,用脚本来实现动作的批量执行。

二、shell脚本的编写

1.建立一个新的shell脚本


(1)新建脚本

vim test.sh	##用vim编写脚本

 一般情况,shell脚本通常以“.sh”结尾


(2)指定执行环境

#!/bin/bash	##脚本使用的解释器,通常用幻数“#!”指定

 其中,幻数是指脚本的执行环境,幻数不同,执行的环境不同。

 (3)脚本的说明信息

#AUTHOR		##脚本作者
#DATE		##脚本创作时间
#MAIL		##脚本作者联系方式
#VERSION	##脚本的版本

 (4)脚本的执行

(1)sh test.sh
(2)source test.sh = . test.sh		##不打开新的shell
(3)./test.sh		##必须给脚本加上可执行权限chmod +x test.sh

 

 注意:使用【sh test.sh】或【./test.sh】命令,会打开一个新的shell环境,在新的环境中是找不到之前定义的变量。

 (5)脚本的调式

sh -x test.sh		##适用于所有shell脚本
vim test.sh		##shell脚本必须有X权限
#!/bin/bash -x

 如果脚本中存在书写错误或命令写错等错误,在调式时会逐行运行,找出错误。

 2. 脚本信息的自动创建
在使用中,为了方便查看该脚本的一些信息,我们一般都会在脚本中添加作者、创建信息等基本信息。我们在大量创建脚本文件时,如果一个一个的添加,速度是非常慢的,那么让我们来看一看如何自动添加脚本的基本信息。

vim /etc/vimrc
map <F9> ms:call WESTOS()<cr>'s		##快捷键控制
autocmd BufNewFile *.sh,*.script exec ":call WESTOS()"		##自动控制
function WESTOS()
	call append(0,"################################")
	call append(1,"# Author:		      #")
	call append(2,"# Create_Time:	".strftime("%Y-%m-%d")."      #")
	call append(3,"# Version:		      #")
	call append(4,"# Mail:			      #")
	call append(5,"# Description:	      #")
	call append(6,"#			          #")
	call append(7,"#			          #")
	call append(8,"################################")
	call append(9,"")
	call append(10,"#!/bin/bash")
endfunction

 

 测试:创建一个脚本文件,观察基本信息是否显示

练习:编写一个脚本用来清空日志信息

三、变量的使用

1. 变量命名

定义变量时,变量名不加美元符号($,php语言中变量需要),如:

your_name="yikoulinux"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

  • 中间不能有空格,可以使用下划线(_)。

  • 不能使用标点符号。

  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

  • 变量名称一般习惯为大写

有效的 Shell 变量名示例如下:

RUNOOB
LD_LIBRARY_PATH
_var
var2

无效的变量命名:

?var=123
user*name=runoob

对于学习不懂的,或者不知道怎么学习的可以来我的QQ群:581499282,不管你是小白还是大牛,小编都欢迎,我也是这么学好的,群不定期分享干货,欢迎初学和进阶中的小伙伴。 

2. 常用变量

Linux Shell 中的变量分为:系统变量和用户自定义变量。

  1. 系统变量:、PWD、、USER 等等比如:echo $HOME 等等..

  2. 用户自定义变量:

  1. 定义变量:变量=值 2)显示当前 shell 中所有变量:set 3)撤销变量:unset 变量

  2. 声明静态变量:readonly 变量,注意:不能 unset

  1. 将命令的返回值赋给变量(重点)

除了显式地直接赋值,还可以用语句给变量赋值,如:1) A=ls -la反引号,运行里面的命令,并把结果返回给变量 A 2)

A=$(ls -la)

$等价于反引号

3)

for file in `ls /etc`

for file in $(ls /etc)

以上语句将 /etc 下目录的文件名循环出来。

3. 举例

例1:含义如下:

  1. 定义一个变量名为name的变量,值为一口linux

  2. 输出变量name的值

  3. 定义一个变量名为number的变量,初始值为22

  4. 输出变量number的值

  5. 直接输出带变量的字符串

  6. 使用双引号输出带变量的字符串

  7. 使用单引号输出带变量的字符串

  8. 使用双引号输出带不存在的变量的字符串,不存在的变量默认为空

  9. 使用双引号来声明字符串中的变量

  10. 使用大括号&变量名,声明字符串中的变量

注意:上述变量是临时变量,当关闭终端后,变量就会消失。

例2:删除变量并查看指定变量

  1. unset name  删除变量name

  2. 查看name变量

四、字符串的操作

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。

其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

1. 字符串操作(长度,读取,替换)

表达式含义
  
$#string$string的长度
$string:position在 中从位置position开始提取子串
$string:position:length在中从位置position开始提取长度为$length的子串
$string#substring从变量的开头删除最短匹配substring的子串
$string##substring从变量的开头删除最长匹配substring的子串
$string%substring从变量的结尾删除最短匹配substring的子串
$string%%substring从变量的结尾删除最长匹配substring的子串
$string/substring/replacement使用来代替第一个匹配的substring
$string//substring/replacement使用代替所有匹配的substring
$string/#substring/replacement如果的前缀匹配substring, 那么就用来代替匹配到的substring
$string/%substring/replacement如果的后缀匹配substring, 那么就用来代替匹配到的substring

说明:"* $substring”可以是一个正则表达式.

2. 字符串操作举例

a) 计算字符串长度

root@ubuntu:/home/peng# test='I love china'
root@ubuntu:/home/peng# echo $#test
12

$#变量名得到字符串长度

b) 截取字串

root@ubuntu:/home/peng# test='I love china'
root@ubuntu:/home/peng# echo $test:5
e china
root@ubuntu:/home/peng# echo $test:5:10
e china
root@ubuntu:/home/peng# 
root@ubuntu:/home/peng# echo $test:4:10
ve china

$变量名:起始:长度得到子字符串

c) 字符串删除

root@ubuntu:/home/peng# test='c:/windows/boot.ini'
root@ubuntu:/home/peng# echo $test#/
c:/windows/boot.ini
root@ubuntu:/home/peng# echo $test#*/
windows/boot.ini
root@ubuntu:/home/peng# echo $test##*/
boot.ini
root@ubuntu:/home/peng# echo $test%/*
c:/windows
root@ubuntu:/home/peng# echo $test%%/*
c:

$变量名#substring正则表达式从字符串开头开始配备substring,删除匹配上的表达式。
$变量名%substring正则表达式从字符串结尾开始配备substring,删除匹配上的表达式。

注意:

$test##*/,$test%/* 分别是得到文件名,或者目录地址最简单方法。

d) 字符串替换

root@ubuntu:/home/peng# test='c:/windows/boot.ini'
root@ubuntu:/home/peng# echo $test/\\//\\\\
c:\\windows/boot.ini
root@ubuntu:/home/peng# echo $test//\\//\\\\
c:\\windows\\boot.ini

$变量/查找/替换值 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\\/”表示。

注意:字符串的位置是从0开始,-1表示该字符串最后一个位置;截取字符串的时候,是左闭右开的,从左边的位置开始,一直到右边的位置结束,不包括右边的位置。

五、 脚本的创建和执行

shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称他为shell脚本。事实上,shell脚本就是一些命令的集合。我们通常把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成了 一般shell脚本都是放在/usr/local/sbin的目录下。

1) shell脚本的建立

在linux系统中,shell脚本(bash shell程序)通常是在编辑器(如vi/vim)中编写,由unix/linux命令、bash shell命令、程序结构控制语句和注释等内容组成,推荐用vim编辑器。

2) 脚本开头(第一行)

一个规范的shell脚本的第一行会指出由哪个程序(解释器)来执行脚本中的内容,在linux bash编程中一般为:

#!/bin/bash

#!/bin/sh  <==255个字符以内

其中开头的"#!"又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用哪个程序解释脚本中的内容, 注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行,例如下面的例子。

root@ubuntu:/home/peng# cat test1.sh
#!/bin/bash
echo "scajy start"
#!/bin/bash      <==写到这里就是注释
#!/bin/sh
echo "scajy en:"

sh和bash的区别

root@ubuntu:/home/peng# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 21  2015 /bin/sh -> bash

提示:sh为bash的软连接,这里推荐用标准写法#!/bin/bash

Bash是GNU/Linux默认的shell,和Bourne shell (sh)兼容,Bash采用了Korn shell (Ksh)和C shell(csh)的特色。符合IEEE POISIX P10003.2/ISO 9945.2 shell and tools 标准。

Centos和redhat linux 下默认的shell 均为bash 因此,在写shell脚本的时候,我们的脚本的开头也可以不加#!/bin/bash。但如果当前的shell非你默认的shell时,比如tcsh,那么久必须要写#!了。否则脚本文件就只能执行一些命令的集合,不能够使用shell内建的指令了,建议读者养成习惯,不管什么脚本最好都加上开头语言标识,这在后文的shell编程规范中会再次提到。如果脚本的开头不指定解析器,那么,就要用对应的解释器来执行脚本。例如:bash test.sh

3) 脚本注释

在shell脚本中,跟在(#)#号后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被执行,仅仅是给人看的,注释可自一行,也可以跟在脚本命令后面与命令在同一行,开发脚本时,如果没有注释,其他人就很难理解脚本究竟在做什么,时间长了自己也会忘记。因此,我们要尽量成为所做的工作(脚本等)书写注释的习惯,不光是方便别人,也是方便自己。否则写完一个脚本后也许后就记不起脚本的用途了,在重新阅读也会浪费很多宝贵时间。对于团队的协作也不利。

4) 举例

创建文件first.sh,并拷贝如下信息到文件:

#cd usr/local/sbin
# vim first.sh
#! /bin/bash

##this is my first shell script
#wirten by 一口Linux 2021.5.3

date
echo "Hello world"

shell脚本通常以.sh为后缀名

执行脚本以下几种方法都可以:

#sh first.sh
#bash first.sh
#./first.sh
#./first.sh

会报权限不够 可以:

#chmod +x first.sh

六、环境变量的使用

1. 知识点详解

  1. Linux Shell 中的变量分为:系统变量和用户自定义变量。

  2. 系统变量:、PWD、、USER 等等比如:echo $HOME 等等..

  3. 用户自定义变量:

1) 定义变量:变量=值
2)显示当前 shell 中所有变量:set
3)撤销变量:unset 变量
4) 声明静态变量:readonly 变量,注意:不能 unset
  1. 定义变量的规则

1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2) 等号两侧不能有空格
3) 变量名称一般习惯为大写
  1. 将命令的返回值赋给变量(重点)

1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量 A
2)A=$(ls -la) 等价于反引号
  1. 设置环境变量的基本语法:

export 变量名=变量值 (功能描述:将 shell 变量输出为环境变量)
source 配置文件(功能描述:让修改后的配置信息立即生效)
echo $变量名(功能描述:查询环境变量的值)

2. 操作详解

查看环境变量HOME、PATH的值:

root@ubuntu:/home/peng# echo $HOME
/root
root@ubuntu:/home/peng# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin

查看windows系统中的环境变量

查看环境变量PATH中所有的路径

脚本路径安装举例

方法1:修改环境环境变量:在PATH中添加指定“软件安装”的目录:

root@ubuntu:/home/peng/yikou# pwd
/home/peng/yikou
root@ubuntu:/home/peng/yikou# ls
a.sh
root@ubuntu:/home/peng/yikou# sh a.sh
Sun May  2 17:00:14 PDT 2021
Hello world
root@ubuntu:/home/peng/yikou# export PATH=$PATH:/home/peng/yikou/
root@ubuntu:/home/peng/yikou# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin:/home/peng/yikou/
root@ubuntu:/home/peng/yikou# a.sh
bash: /home/peng/yikou/a.sh: 权限不够
root@ubuntu:/home/peng/yikou# chmod 777 a.sh 
root@ubuntu:/home/peng/yikou# a.sh 
Sun May  2 17:01:34 PDT 2021
Hello world

方法2:修改环境变量配置文件的方式,使修改后的环境变量永久生效

vim /etc/bash.bashrc

source .bash.rc ,使配置文件重新生效

关闭终端,打开并重新重新输入:a.sh依旧可以执行。

root@ubuntu:/home/peng/# a.sh 
Sun May  2 17:10:00 PDT 2021
Hello world

七、数学运算

1. 知识点详解

运算符使用的语法:

expr操作符对照表操作符含义

2. 操作详解

  1. 比较大小,只能对整数进行比较,需要加空格,linux 保留关键字要转义

root@ubuntu:/home/peng/yikou# num1=30
root@ubuntu:/home/peng/yikou# num2=50
root@ubuntu:/home/peng/yikou# expr $num1 \\> $num2
0

查看上一条命令有没有执行成功:返回0 成功,其他失败

  1. 小于、小于等于、大于等于

expr $num1 \\< $num2
expr $num1 \\<= $num2
expr $num1 \\>= $num2

  1. 运算 加、减、乘、除

# 加
num1=17
num2=5
expr $num1 + $num2
 
# 减
num3=`expr $num1 + $num2`
echo $num3
 
expr $num1 - $num2
 
# 乘
expr $num1 \\* $num2
expr $num1 / $num2
 
# 取余数
expr $num1 % $num2

需要注意事项:

两个小括号的计算方法,要赋值,否则会报错

在这里我还是要推荐下我自己建的Web安全运维群:581499282,群里都是学Web安全运维的,如果你正在学习网络安全/运维 ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是技术党,不定期分享干货,包括我自己整理的一份2021最新的Web安全入门/进阶资料和Linux运维核心命令手册,欢迎进阶中和进想深入的小伙伴。

八、脚本与用户交互

操作命令行参数

1.  读取参数

bash shell用位置参数变量(positional parameter)存储命令行输入的所有参数,包括程序名。其中,表示程序名,1表示第1个参数,表示第个参数,,9表示第9个参数。如果参数个数多于9个,必须如下表示变量:,11,...

#!/bin/bash
# author:一口Linux
for((count = 1; count <= $1; count++))
do
    echo The number is $count.
done

执行结果:

修改脚本如下:

echo $1, $2, $3, $4

执行结果如下:

2 读取程序名

首先想到的是利用,但是0获取的文件名包括./以及路径等前缀信息,如下:

echo The command entered is: $0
# 运行:./
# 输出:The command entered is: ./14.sh

如果想仅得到文件名,而不包含./,可以使用basename命令:

name=`basename $0`
echo The command entered is: $name
# 运行:./
# 输出:The command entered is: 14.sh

3 特殊变量

$#表示命令行参数的个数:
#!/bin/bash
# author:一口Linux
params=$#

echo The number of params is: $params
for((i = 1; i <= params; i++))
do
    echo The param is: $i
done

执行结果

如果想获取所有的参数,当然可以利用#和循环逐个遍历。也可以利用如下两个特殊变量:*将所有的命令行参数看作一个整体存储,而$@将命令行中以空格间隔的参数单独存储,如下:

#!/bin/bash
# author:一口Linux
count=1
for param in "$*"
do
    echo "\\$* parameter $count = $param"
    count=$[ $count + 1 ]
done

count=1
for param in "$@"
do
    echo "\\$@ parameter $count = $param"
    count=$[ $count + 1 ]
done

4 基本的读取

read命令接受从键盘或文件描述符中的输入数据,将其存储到一个指定变量中。

选项:

-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
-n:设置允许输入字符的个数

参数

变量:指定读取值的变量名

操作详解

  1. 例1

#!/bin/bash
# author:一口Linux
# testing the read option

read -p "Please enter your name: " name
echo "Hello $name."

执行结果

  1. 例2 read命令中,可以根据需要将输入的数据保存在多个变量中,如果指定的变量比较少,那么最后一个变量将包含余下的所有输入,如下所示:

#!/bin/bash
# author:一口Linux
# testing the read option

read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"

执行结果:

  1. 综合例子 提示用户输入一个正整数num,然后计算1+2+3+...+num的值;必须对num是否为正整数做判断,不符合应当运行再次输入

思路:

  • expr只能对整数进行计算,直接用expr 和一个整数计算获取 $? 的值来判断是否为整数

  • 在使用 expr $num1 > 0 判断是否大于0

#!/bin/bash
# author:一口Linux
while true
do
        read -p "please input a positive number: " num
        # 判断数是否是整数
        expr $num + 1 &> /dev/null
        if [ $? -eq 0 ];then
                # 判断这个整数是否大于0,大于0返回1
                if [ `expr $num \\> 0` -eq 1 ];then
                        #echo "yes,positive number"
                        # $sum没有赋值,默认为0
                        for i in `seq 0 $num`
                        do
                                sum=`expr $sum + $i`
                        done
                        echo "1+2+3+...+$num = $sum"
                        # 执行计算需要退出
                        exit
                fi
        fi
        echo "error,input enlegal"
        continue
done

测试:

九、关系运算符

有时候我们需要比较两个数字的大小关系,这时候就要用到关系运算符。关系运算符只支持数值运算,不支持字符运算。

1. 知识点详解

Shell 语言支持下面这些关系运算符:

-eq:检测两个数是否相等,相等返回 true。
-ne:检测两个数是否不相等,相等返回 true。
-gt:检测左边的数是否大于右边的,如果是返回 true。
-lt:检测左边的数是否小于右边的,如果是返回 true。
-ge:检测左边的数是否大于等于右边的,如果是返回 true。
-le:检测左边的数是否小于等于右边的,如果是返回 true。

2. 操作详解

#!/bin/bash
# author:一口Linux

a=10
b=20

if [ $a -gt $b ]
then
   echo "a great than b"
else
   echo "a not great than b"
fi

执行结果!如下:

十、字符串运算符

1. 知识点详解

= 比较两个字符串是否相等
!= 比较两个字符串是否不相等
-z 检测字符串的长度是否为零
-n  检测字符串的长度是否不为零
$字符名 变量是否有负值(为空),有返回True,没有返回False

2. 操作详解

#!/bin/bash
# author:一口Linux

###本脚本主要用于字符串运算符
if [ ! $1 ]
then
    echo "第一个参数为空"
    echo "****************************************************************"
    echo "****************************************************************"
    echo "**************执行用例的格式为:sh $0 变量1 变量2***************"
    echo "****************************************************************"
    echo "****************************************************************"
    break
else
    if [ ! $2 ]
    then
        echo "第二个参数为空"
        echo "****************************************************************"
        echo "****************************************************************"
        echo "**************执行用例的格式为:sh $0 变量1 变量2***************"
        echo "****************************************************************"
        echo "****************************************************************"
        break
    else
        ###1、检测两个字符串是否相等;
        if [ $1 = $2 ]
        then
            echo "这是第一个判断语句"
            echo "变量1等于变量2"
        else
            echo "这是第一个判断语句"
            echo "变量1不等于变量2"
        fi
        ###2、检测两个字符串是否不相等;
        if [ $1 != $2 ]
        then
            echo "这是第二个判断语句"
            echo "变量1不等于变量2"
        else
            echo "这是第二个判断语句"
            echo "便量1等于变量2"
        fi
        ###3、检测字符串长度是否为0
        if [ -z $1 ]
        then
            echo "这是第三个判断段语句"
            echo "变量1字符串长度为0"
        else
            echo "这是第三个判断段语句"
            echo $1
        fi
        ###4、检测字符串长度是否不为0
        if [ -n $2 ]
        then
            echo "这是第四个判断语句"
            echo "变量2字符串长度不为0"
            echo $2
        else
            echo "这是第四个判断语句"
            echo "变量2字符串长度为0"
        fi
        ###5、检测字符串是否不为空
        if [ $1 ]
        then
            echo "这是第五个判断语句"
            echo "变量1不为空"
        else
            echo "这是第五个判断语句"
            echo "变量1为空"
        fi
    fi
fi

测试结果:

十一、shell文件及目录常用操作的几个实例

  1. 提取路径的目录和文件名 提取目录:

dirname $path

提取文件名:

basename $path
  1. 批量重命名带有空格文件

function processFilePathWithSpace() 
 find $1 -name "* *" | while read line
 do 
 newFile=`echo $line | sed 's/[ ][ ]*/_/g'`
 mv "$line" $newFile
logInfo "mv $line $newFile $?"
 done
 
  1. 遍历文件内容

cat /tmp/text.txt | while read line
do
 echo $line
done
  1. 文件不存在,则创建文件

[ -f $logFile ] || touch $logFile
  1. 递归遍历目录

function getFile()
 for file in `ls $1`
 do
  element=$1"/"$file
     if [ -d $element ]
  then 
         getFile $element
     else
         echo $element
     fi  
 done

  1. 清空文件内容

cat /dev/null > $filePath

推荐下我自己建的Web安全运维群:581499282,群里都是学Web安全运维的,如果你正在学习网络安全/运维 ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是技术党,不定期分享干货,包括我自己整理的一份2021最新的Web安全入门/进阶资料和Linux运维核心命令手册,欢迎进阶中和进想深入的小伙伴。

以上是关于超详细!Linux入门之手把手教你shell脚本编程(字符串环境变量运算符)的主要内容,如果未能解决你的问题,请参考以下文章

超详细!Linux入门之手把手教你shell脚本编程(字符串环境变量运算符)

Linux从入门到放弃零基础入门Linux(第三篇):在虚拟机vmware中安装linux超详细手把手教你安装centos6分步图解

【超详细】手把手教你在Linux下安装Python

手把手教你启用Win10的Linux子系统(超详细)

2023年最新Kali安装教程(超详细,手把手教你下载安装kali虚拟机)

低价韩顺平教你快速入门Linux基础+环境配置+shell脚本