声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章
感谢泷羽sec 团队的教学
视频地址:shell脚本(1)脚本创建执行与变量使用_哔哩哔哩_bilibili
一、Shell脚本的创建与执行
1.创建
创建一个.sh文件,使用vim编辑文件内容
2.执行
(1)./1.sh
#使用默认的shell解释器来执行
./1.sh
这个命令告诉系统在当前目录下查找名为 1.sh
的文件,并使用默认的shell解释器来执行它。
具体来说,./1.sh
的含义如下:
-
./
:这是一个特殊的路径表示法,代表当前工作目录。当你在命令行中使用./
前缀时,你是在告诉系统在当前目录中查找指定的文件或脚本。 -
1.sh
:这是脚本文件的名称。.sh
是一个常见的文件扩展名,用于表示这是一个shell脚本文件。Shell脚本是一种包含一系列命令的文本文件,这些命令可以在shell环境中执行。
当你运行 ./1.sh
命令时,系统会执行以下步骤:
- 系统会在当前目录中查找名为
1.sh
的文件。 - 如果找到了这个文件,并且它具有执行权限(通过
chmod
命令设置),系统会使用默认的shell解释器(通常是/bin/bash
或/bin/sh
)来执行脚本中的命令。 - 脚本中的命令会按照它们在脚本文件中的顺序依次执行。
如果脚本文件没有执行权限,你可以通过运行 chmod u+x 1.sh
命令来给予它执行权限,其中 u+x
表示为文件所有者添加执行权限。之后,你就可以再次尝试运行 ./1.sh
来执行脚本了。
注意:可以利用 #!/bin/bash
、#!/bin/dash
、#!/bin/sh
这三种其实不管用哪种脚本解释器,最后调用的还是这个dash。比如 ls -l /bin/sh
发现调用的是dash。
(2)sh
#使用sh作为解释器来执行脚本
sh 2.sh
sh 2.sh
是一个在Unix-like操作系统的命令行中执行shell脚本的命令。这里,sh
是指定使用 sh
作为解释器来执行后面的脚本文件 2.sh
。
具体来说,sh 2.sh
的含义如下:
-
sh
:这是Unix和类Unix系统中的一个命令,用于启动一个新的shell会话。在这种情况下,它被用作一个脚本解释器,用于执行指定的shell脚本。sh
通常链接到系统中的一个shell程序,如bash
、dash
或ksh
,具体取决于系统的配置。 -
2.sh
:这是脚本文件的名称。.sh
是一个常见的文件扩展名,用于表示这是一个shell脚本文件。Shell脚本是一种包含一系列命令的文本文件,这些命令可以在shell环境中执行。
当你运行 sh 2.sh
命令时,系统会执行以下步骤:
- 系统会在当前目录中查找名为
2.sh
的文件。 - 如果找到了这个文件,系统会使用
sh
指定的shell解释器来执行脚本中的命令。 - 脚本中的命令会按照它们在脚本文件中的顺序依次执行。
使用 sh
来执行脚本而不是直接使用 ./2.sh
的主要原因是,sh
允许你明确指定使用哪个shell解释器来执行脚本,这在脚本需要特定shell解释器特性或者需要与脚本文件的shebang行指定的解释器不同的情况下非常有用。
(3)source
#在当前的shell环境中执行脚本
source 2.sh
source 2.sh
是一个在Unix-like操作系统的命令行中执行shell脚本的命令,但它与直接执行脚本(如 ./2.sh
或 sh 2.sh
)有所不同。source命令用于在当前的shell环境中执行脚本,而不是创建一个新的shell进程来执行脚本。
具体来说,source 2.sh
的含义如下:
-
source
:这是一个bash内置命令(在其他shell中可能被称为.
或source
),它读取指定的文件并执行其中的命令。使用source
时,脚本中的命令会在当前的shell会话中执行,这意味着脚本中所做的任何更改(如变量赋值或函数定义)都会在脚本执行完毕后保留在当前的shell环境中。 -
2.sh
:这是脚本文件的名称。.sh
是一个常见的文件扩展名,用于表示这是一个shell脚本文件。Shell脚本是一种包含一系列命令的文本文件,这些命令可以在shell环境中执行。
当你运行 source 2.sh
命令时,系统会执行以下步骤:
- 系统会在当前目录中查找名为
2.sh
的文件。 - 如果找到了这个文件,系统会使用当前的shell解释器来执行脚本中的命令,而不是启动一个新的shell进程。
- 脚本中的命令会按照它们在脚本文件中的顺序依次执行,且所有命令的执行结果都会反映在当前的shell环境中。
使用 source
命令的一个常见原因是为了在当前shell会话中设置环境变量或定义函数,这样在脚本执行完毕后,这些设置仍然有效。这在配置环境或设置别名时非常有用。例如,如果你的 2.sh
脚本中包含了设置环境变量的命令,使用 source 2.sh
可以确保这些变量在脚本执行后仍然可用。
二、变量的使用
1.变量定义
变量定义使用等号 =
,等号两边不能有空格。变量名通常以字母开头,后面可以跟字母、数字或下划线。
# 定义一个变量
my_variable="some value"
# 定义一个数字变量
number=42
# 定义一个包含空格的字符串变量
greeting="Hello, World!"
2.变量引用
要使用变量的值,需要在变量名前加上美元符号 $
。、
# 引用变量
echo $my_variable
echo $number
echo $greeting
3.变量展开
在双引号 ""
内部,变量会被展开,即它们的值会被替换。
# 变量展开
echo "The value is $my_variable."
在单引号 '
内部,变量不会被展开,即它们的值会被保留为字面字符串。
# 变量不展开
echo 'The value is $my_variable.'
4.变量的删除
可以使用 unset
命令来删除变量。
#删除变量
unset $my_variable
5.环境变量
环境变量是在shell启动时设置的变量,它们可以被shell及其子进程访问。环境变量通常用于配置系统和应用程序的行为。
方法一:
目的:将自定义的 1.sh
脚本放置到 /usr/bin/
目录下,以便在终端中直接执行。
操作步骤
#查看环境变量
echo $PATH
#编写脚本
vim test.sh
#移动目录
mv test.sh /usr/bin
将脚本移动到 /usr/bin/
目录。这个目录是系统默认的可执行文件路径之一,因此放置在此的脚本可以直接通过命令名执行。
方法二:
- 目的:通过将
/root/
目录添加到环境变量PATH
中,使得该目录下的文件可以直接在终端中执行。
操作步骤
-
添加目录到PATH:
-
export PATH=/root:$PATH
这行命令将
/root/
目录添加到PATH
环境变量的前面。这样,当系统查找可执行文件时,会首先在/root/
目录下查找。 -
检查PATH变量:
-
echo $PATH
使用
echo
命令来查看PATH
环境变量的当前值,以确认/root/
目录是否已经被添加。
解释
-
export:这是一个用于设置环境变量的关键字,它确保设置的变量不仅在当前shell中有效,而且在由该shell启动的子进程中也有效。
-
PATH:这是一个非常重要的环境变量,它定义了系统在哪些目录下去寻找可执行程序。当你在命令行输入一个命令(如
ls
、cat
等)时,系统会根据PATH
环境变量所指定的目录顺序去查找对应的可执行文件,找到后就执行它。 -
重新定义PATH:通过
/root:$PATH
的形式,/root/
目录被添加到了原有的PATH
变量值的最前面。这意味着,当系统去查找可执行程序时,会先在/root/
目录下查找,然后再按照原来PATH
所指定的其他目录顺序查找。
6.永久变量
-
临时变量:使用
export
命令设置的环境变量是临时的,它们只在当前的shell会话及其子进程中有效。一旦关闭终端或结束会话,这些设置就会丢失。 -
永久生效:要使环境变量设置永久生效,需要将它们添加到用户的配置文件中。对于bash shell,常用的配置文件包括
.bashrc
、.bash_profile
或.profile
。
操作步骤
-
编辑配置文件: 使用文本编辑器(如
vi
)打开.bashrc
文件:vi .bashrc
这将打开当前用户的
.bashrc
文件,允许你进行编辑,打开.bashrc
要注意是文件路径。 -
添加环境变量设置: 在
.bashrc
文件中添加以下行:export PATH=/root:$PATH
这行命令将
/root
目录添加到PATH
环境变量的前面,使得/root
目录下的程序可以直接执行。 -
保存并退出编辑器: 在
vi
编辑器中,按Esc
键退出编辑模式,然后输入:wq
保存更改并退出。 -
使变量生效: 要使在
.bashrc
中所做的更改立即生效,可以使用source
命令:source .bashrc
这将重新加载
.bashrc
文件,应用其中的所有更改,包括对PATH
的修改。
通过将环境变量设置添加到 .bashrc
或其他配置文件中,你可以确保这些设置在每次登录时自动应用,从而实现永久生效。
7.字符串操作
当变量是字符串时,有以下操作
(1)获取字符串长度
假设我们想知道一个字符串的长度,可以使用 ${#str}
来获取字符串 str
的长度。
str="hello world"
echo ${#str}
这将输出字符串 str
的长度,在这个例子中是 11。
(2)打印完整字符串
可以通过 echo
命令和变量展开来打印包含变量的完整字符串。
name="xiaoyu"
age=27
echo "my name is $name, and i am $age years old"
这将输出:my name is xiaoyu, and i am 27 years old
。
(3)截取字符串的一部分
可以使用 ${str:start:length}
来截取字符串 str
从位置 start
开始的 length
个字符。
str="hello world"
echo ${str:0:3}
这将输出字符串 str
的前三个字符,即 hel
。