一小时实践入门 Bash
The GNU Bourne-Again SHell : BASH
Linux Bash语法总结
Bash 简介
Linux脚本:Bash脚本看这一篇就够了 https://blog.csdn.net/weixin_43431593/article/details/127550041
BASH Shall脚本格式以及常规语法 https://blog.csdn.net/weixin_38468167/article/details/108337782
----------------------------------------------------------------------
一、创建脚本格式 https://blog.csdn.net/weixin_38468167/article/details/108337782
- 定义bash脚本:#!/bin/bash
- 编写执行语句
- 保存并退出
- 设置权限:chmod +x 脚本路径
- 运行脚本:
1、当前路径调用方式: ./脚本名(当前目录下)
2、普通调用方式: sh 脚本名
3、指定b shall执行:/bin/bash 脚本名 (该方式等同于 ./的方式) 或bash 脚本名
- 示例:
#!/bin/bash
echo "Hello BShall"
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_38468167/article/details/108337782
========================================
The GNU Bourne-Again SHell : BASH
https://tiswww.case.edu/php/chet/bash/bashtop.html#Resources
Introduction
Bash is the GNU Project's Bourne Again SHell, a complete implementation of the IEEE POSIX and Open Group shell specification with interactive command line editing, job control on architectures that support it, csh-like features such as history substitution and brace expansion, and a slew of other features. Here is a short list of some of the features available in bash.
For more information on the features of Bash that are new to this type of shell, see the reference manual. There is also a large Unix-style man page. The man page is the definitive description of the shell's features.
Bash is free software, distributed under the terms of the GNU General Public License, version 3.
A number of frequently-asked questions are answered in the FAQ, though that is no longer maintained.
Bash 简介
https://learn.microsoft.com/zh-cn/training/modules/bash-introduction/
Linux Bash语法总结
https://blog.csdn.net/weixin_45186298/article/details/104171247
一小时实践入门 Bash
https://zhuanlan.zhihu.com/p/643448977
前置知识
学习 Bash 时,你不需要提前了解太多的技术或软件。然而,以下是一些可以帮助你更好地理解和学习 Bash 的知识和技能:
- 基本的计算机科学知识:理解如何使用计算机和基本的计算机科学概念(如文件系统,进程,输入/输出等)会有所帮助。
- 基本的命令行接口(CLI)知识:Bash 是一个命令行接口,因此熟悉如何在命令行环境中工作是很有帮助的。这包括理解命令行的基本概念(如命令,参数,选项等)和常见的命令行任务(如导航文件系统,管理文件和目录,运行程序等)。
- Linux或UNIX系统:Bash 最初是为 Unix 系统开发的,现在它在 Linux 和 macOS(基于 Unix)上也非常普遍。如果你计划在这些系统上使用 Bash,那么对它们有一些基本的了解将会很有帮助。(macOS-->freeBSD-->unix; Linux-->unix)
- 基本的编程知识:虽然 Bash 不需要你是一位经验丰富的程序员,但是理解一些基本的编程概念(如变量,控制流,数据类型,函数等)会使学习 Bash 更容易。
- 文本编辑器:编写 Bash 脚本需要一个文本编辑器。你可以使用任何你喜欢的文本编辑器,但是一些文本编辑器(如 Vim 或 Emacs)在命令行环境中工作得特别好。
除了这些,你需要一个可以运行 Bash 的系统。这可以是一个 Linux 或 Unix 系统,或者如果你在 Windows 上,你可以使用 Windows Subsystem for Linux(WSL)。
实践计划
了解你已经有的基础之后,我为你制定了一小时的 Bash 学习计划。这个计划以实践项目为目标,可以帮助你快速理解和运用 Bash 的基本概念和语法。
项目目标:自动化脚本
编写一个 Bash 脚本,用于自动化一些常见的系统任务,如创建文件和目录、查找文件、检查进程状态等。
学习计划:
- 了解 Bash 和 Shell 的基本概念(10分钟)
了解什么是 Shell,什么是 Bash,Bash 和其他 Shell(如 sh、zsh)的区别是什么,以及为什么我们需要 Bash。 - 学习 Bash 的基本语法(20分钟)
学习如何在 Bash 中使用变量、数组、循环(for、while)和条件语句(if、case)。学习如何定义和使用函数,以及如何处理输入参数。 - 学习 Bash 中的文件和目录操作(10分钟)
学习如何在 Bash 中创建、读取、写入、移动、复制和删除文件和目录。学习如何使用 globbing(通配符)来匹配文件和目录。 - 学习 Bash 中的进程管理(10分钟)
学习如何在 Bash 中启动、停止、监控和杀死进程。 - 编写自动化脚本(10分钟)
利用已经学习的知识,编写一个简单的自动化脚本,例如,一个可以查找特定文件、检查特定进程是否在运行,如果没有运行则启动它的脚本。
记住,这是一个非常紧凑的学习计划,可能需要你在课后花费更多的时间来巩固和练习。此外,Bash 的功能非常强大,这个计划只涵盖了其基本用法。如果你发现自己对 Bash 非常感兴趣,可以花费更多的时间来学习更高级的功能,如脚本调试、错误处理等。
Bash 和 Shell 的基本概念
- Shell:在计算机科学中,Shell 是一个用户和操作系统之间交互的接口。Shell 读取和解释用户输入的命令,并向操作系统传达这些命令。当操作系统执行完这些命令后,Shell 会将结果返回给用户。
Shell 可以是命令行接口(CLI),也可以是图形用户接口(GUI)。
在 Unix 和类 Unix 系统(如 Linux)中,我们通常指的是命令行 Shell。 - Bash:Bash(Bourne Again SHell)是一个由 Brian Fox 为 GNU 项目开发的 Unix shell 和命令语言。
它是 Bourne Shell(sh)的扩展,包含了很多特性,如命令行编辑、键盘快捷键、命令行历史记录、命令行完成(tab 键自动补全)等。Bash 是很多 Linux 发行版的默认 Shell。 - sh:sh(Bourne Shell)是 Unix 操作系统的原始 Shell,由 Stephen Bourne 在 Bell Labs 开发。它的功能相对较少,但在所有 Unix 系统中都存在,因此是写跨平台脚本的好选择。
- zsh:zsh(Z Shell)是一个扩展于 Bash 的 Shell,包含了很多额外的特性,如主题和插件支持、更强的命令行提示(例如右提示)、更强大的命令行补全等。近年来,由于其高度的可定制性和用户友好性,zsh 已经在开发者社区中越来越流行。
Bash、sh 和 zsh 都是 Shell,但它们之间的主要区别在于它们支持的特性和语法。
例如,Bash 和 zsh 支持数组和关联数组,而 sh 不支持。
另一个例子是,Bash 和 sh 使用 echo -e
来支持转义字符,而 zsh 直接使用 echo
。这就意味着,尽管大部分 sh 脚本可以在 Bash 和 zsh 中运行,但并非所有 Bash 和 zsh 脚本都可以在 sh 中运行。
为什么我们需要 Bash
Bash 是在 Unix 和 Unix-like 系统(如 Linux)上最常见的命令行界面,它有几个主要的优点使得我们需要使用它:
- 自动化:Bash 可以执行一系列的命令,这些命令可以写入到脚本中,并在需要的时候执行。这种自动化可以极大地提高效率,特别是对于重复的任务。
- 批处理:Bash 能处理大量的文件和数据,你可以用它来批量重命名文件,或者在大量的文本文件中查找特定的内容。
- 系统管理:Bash 提供了一种简单的方式来执行系统管理任务,比如管理用户账户,更新系统,管理服务和进程等。
- 强大的命令行工具:Unix 和 Unix-like 系统提供了大量的命令行工具,比如 grep、awk、sed、find 等。这些工具在 Bash 中可以灵活地使用,并且可以组合起来执行复杂的任务。
- 脚本编程:Bash 也是一种编程语言,它有条件语句,循环语句,函数等编程元素。你可以写 Bash 脚本来完成更复杂的任务。
- 跨平台:几乎所有的 Unix-like 系统都支持 Bash,包括 macOS 和大多数的 Linux 发行版。Windows 10 的 WSL(Windows Subsystem for Linux)也支持 Bash。这意味着你可以在不同的系统上使用同样的 Bash 脚本。
- 开源和免费:Bash 是开源和免费的,任何人都可以使用它,并且可以查看和修改它的源代码。
因此,无论你是系统管理员,开发者,还是日常的计算机用户,Bash 都是一个非常有用的工具。
Bash 的基本语法
变量、数组、循环(for、while)和条件语句(if、case)
以下是在 Bash 中使用这些元素的基本方式。
变量
在 Bash 中,我们可以使用 =
来给变量赋值,然后使用 $
来引用变量的值。注意,=
周围不能有空格。例如:
name="Alice"
echo $name
上面的脚本将打印 "Alice"。
数组
在 Bash 中,我们可以使用 ()
来创建数组,然后使用 ${array[index]}
来引用数组的元素。数组的索引从 0 开始。例如:
colors=("red" "green" "blue")
echo ${colors[0]}
上面的脚本将打印 "red"。
循环
Bash 支持 for
和 while
循环。
以下是 for
循环的基本语法:
for variable in list
do
command1
command2
...
done
例如,以下脚本将打印 1 到 5:
for i in {1..5}
do
echo $i
done
以下是 while
循环的基本语法:
while [ condition ]
do
command1
command2
...
done
例如,以下脚本将打印 1 到 5:
i=1
while [ $i -le 5 ]
do
echo $i
((i++))
done
条件语句
Bash 支持 if
和 case
条件语句。
以下是 if
语句的基本语法:
if [ condition ]
then
command1
command2
...
fi
例如,以下脚本将检查 $name
是否为 "Alice":
name="Alice"
if [ $name = "Alice" ]
then
echo "Hello, Alice!"
fi
以下是 case
语句的基本语法:
case expression in
pattern1 )
command1
command2
;;
pattern2 )
command3
command4
;;
...
esac
例如,以下脚本将检查 $color
的值:
color="red"
case $color in
"red" )
echo "The color is red."
;;
"green" )
echo "The color is green."
;;
"blue" )
echo "The color is blue."
;;
* )
echo "Unknown color."
;;
esac
这些是 Bash 中变量、数组、循环和条件语句的基本使用方式。你可以结合使用这些元素来编写更复杂的 Bash 脚本。
定义和使用函数,以及如何处理输入参数
在 Bash 中,我们可以通过以下的方式来定义函数:
function_name () {
command1
command2
...
}
我们也可以使用 function
关键字来定义函数,如下:
function function_name {
command1
command2
...
}
这两种定义函数的方式是等价的。
函数的参数可以在函数内部通过 $1
、$2
、... 来获取,其中 $1
表示第一个参数,$2
表示第二个参数,以此类推。$0
通常用来表示脚本自身的名字。$#
用来获取参数的个数。$@
和 $*
用来获取所有的参数。
下面是一个示例函数,它接受两个参数并打印它们:
print_params () {
echo "The first parameter is $1."
echo "The second parameter is $2."
echo "All parameters are $@."
}
然后我们可以像下面这样调用这个函数:
print_params Alice Bob
这将会打印:
The first parameter is Alice.
The second parameter is Bob.
All parameters are Alice Bob.
如果你想让函数返回一个值,你可以使用 return
语句,但是注意在 Bash 中,return
语句只能返回一个介于 0 到 255 之间的整数,它通常用来表示程序或函数的退出状态,0 表示成功,非 0 值表示各种不同的错误。如果你想让函数返回其他类型的值,你可以让函数打印这个值,然后在函数外部使用命令替换 ($(command)
) 来获取这个值。例如:
get_length () {
local length=${#1}
echo $length
}
length=$(get_length "Alice")
echo "The length is $length."
这将会打印 "The length is 5."。
在这段代码中,${#1}
表示传递给函数 get_length()
的第一个参数的长度。
具体解释如下:
${1}
是函数get_length()
的第一个参数。${#1}
返回参数$1
的长度。
因此,当调用 get_length()
函数时,传递字符串 "Alice" 作为参数,${#1}
将返回字符串的长度,即 5。
最后,将长度存储在变量 length
中,并通过 echo
语句打印出来。输出将是 "The length is 5."
文件和目录操作
创建、读取、写入、移动、复制和删除文件和目录
在 Bash 中,我们可以使用一些内置的命令来操作文件和目录:
- 创建文件:我们可以使用
touch
命令来创建一个新的空文件,例如:touch
file.txt
这将会创建一个名为file.txt
的新文件。 - 读取文件:我们可以使用
cat
命令来读取一个文件的内容,例如:cat file.txt
这将会打印出file.txt
文件的内容。 - 写入文件:我们可以使用重定向 (
>
) 来将输出写入到一个文件,例如:echo
"Hello, world!" > file.txt
这将会将 "Hello, world!" 写入到file.txt
文件。注意这会覆盖原有文件的内容。如果你想在文件的末尾添加内容,可以使用追加重定向 (>>
),例如:echo
"Hello, again!" >> file.txt
这将会在file.txt
文件的末尾添加 "Hello, again!"。 - 移动文件:我们可以使用
mv
命令来移动一个文件,例如:mv file.txt dir/
这将会将file.txt
文件移动到dir/
目录下。 - 复制文件:我们可以使用
cp
命令来复制一个文件,例如:cp file.txt file_copy.txt
这将会创建一个file.txt
文件的副本,名为file_copy.txt
。 - 删除文件:我们可以使用
rm
命令来删除一个文件,例如:rm file.txt
这将会删除file.txt
文件。
对于目录,我们可以使用类似的命令:
- 创建目录:我们可以使用
mkdir
命令来创建一个新的目录,例如:mkdir
dir
这将会创建一个名为dir
的新目录。 - 移动目录:我们可以使用
mv
命令来移动一个目录,和移动文件的方式一样。 - 复制目录:我们可以使用
cp
命令来复制一个目录,但需要加上-r
(递归)选项,例如:cp -r dir dir_copy
这将会创建一个dir
目录的副本,名为dir_copy
。 - 删除目录:我们可以使用
rm
命令来删除一个目录,但需要加上-r
(递归)选项,例如:rm -r dir
这将会删除dir
目录。
以上是在 Bash 中操作文件和目录的基本命令。
使用 globbing(通配符)来匹配文件和目录
在 Bash 中,我们可以使用 globbing(通配符)来匹配文件和目录的名称。以下是一些常用的 globbing 字符:
*
:匹配任意多个(包括 0 个)字符。例如,*.txt
会匹配所有以.txt
结尾的文件。?
:匹配任意一个字符。例如,?.txt
会匹配所有只有一个字符并且以.txt
结尾的文件,如a.txt
、1.txt
等。[]
:匹配括号中的任意一个字符。例如,[abc].txt
会匹配a.txt
、b.txt
和c.txt
。{}
:匹配大括号中的任意一个字符串。例如,{a,b,c}.txt
会匹配a.txt
、b.txt
和c.txt
。**
:如果启用了globstar
选项(通过shopt -s globstar
命令),**
可以匹配任意多个目录。例如,**/*.txt
会匹配所有目录下的以.txt
结尾的文件。
这些 globbing 字符可以组合使用,例如,*.[ch]
会匹配所有以 .c
或 .h
结尾的文件,file?.*
会匹配所有以 file
开头并且只有一个字符的文件,如 file1.txt
、file2.txt
等。
注意,globbing 只能匹配已经存在的文件和目录,它不能匹配不存在的路径。此外,如果一个文件或目录的名称以 .
开头,那么这个文件或目录默认是隐藏的,不会被 *
匹配,需要使用 .*
来匹配。
进程管理
在 Bash 中,我们可以使用一些内置的命令来管理进程,比如,我们可以使用 sleep
命令来创建一个简单的进程:
- 启动进程:我们可以在命令行中输入一个命令来启动一个进程,例如:
sleep 100
这将会启动一个进程,这个进程将会在 100 秒后结束。如果我们想在后台启动一个进程,我们可以在命令后面加上&
,例如:sleep 100 &
这将会在后台启动一个进程,这个进程将会在 100 秒后结束。 - 停止进程:我们可以使用
kill
命令来停止一个进程。kill
命令需要一个进程 ID(PID)作为参数。我们可以使用ps
命令来查找 PID,例如:ps aux | grep sleep
这将会显示所有关于sleep
的进程。然后我们可以使用kill
命令来停止一个进程,例如:kill 12345
这将会停止 PID 为 12345 的进程。
如果一个进程不响应kill
命令,我们可以使用-9
选项来强制停止一个进程,例如:kill -9 12345
这将会强制停止 PID 为 12345 的进程。 - 监控进程:我们可以使用
top
命令来监控进程。top
命令会显示系统的实时状态,包括 CPU 使用率、内存使用率、运行的进程等。我们可以在top
的界面中按k
来停止一个进程,按r
来重启一个进程。
如果我们想查找特定的进程,我们可以使用ps
命令,如上面所述。 - 杀死进程:杀死进程的操作与停止进程基本相同,通常使用
kill
或kill -9
命令。
以上是在 Bash 中管理进程的基本命令。
ps
和 top
都是在 Unix 和 Unix-like 系统(包括 Linux)中用于查看进程信息的常用命令,但它们的工作方式和用途有所不同。
- ps 命令:
ps
是 "process status" 的缩写,这个命令用于显示当前进程的状态。它提供了关于进程(如进程 ID、当前状态、CPU 使用率、命令行等)的静态视图。默认情况下,ps
只显示当前 shell 和与之关联的进程,但你可以通过选项(如-e
或-A
)来显示所有进程。ps
是一个 "一次性" 的命令,意思是它只会运行一次,然后显示那个时刻的进程信息。 - top 命令:
top
是 "table of processes" 的缩写,这个命令用于动态显示进程信息。top
提供了一个实时的、交互式的视图,显示了系统中的进程并按 CPU 使用率排序。你可以在top
的界面中进行操作,例如发送信号给进程。top
是一个 "持续性" 的命令,意思是它会持续运行,并实时更新显示的信息。
总的来说,ps
和 top
都能提供进程的信息,但 ps
提供静态的、一次性的信息,适合用于查看特定进程的信息或通过管道和过滤器进行复杂的查询;而 top
提供动态的、实时的信息,适合用于监视系统的状态或管理进程。
编写自动化脚本
我将提供一个 Bash 脚本的例子,这个脚本会检查一个特定的进程是否正在运行(例如 nginx
服务),如果没有运行,它就会启动这个进程。同时,这个脚本还会在一个特定的目录中查找一个特定的文件(例如在 /var/log
目录中查找 error.log
文件),并把找到的文件路径打印出来。
以下是这个脚本的实现:
#!/bin/bash
# 定义进程名和文件名
process_name="nginx"
file_name="error.log"
directory_to_search="/var/log"
# 检查进程是否在运行
pgrep -x $process_name > /dev/null
if [ $? -ne 0 ]; then
# 如果进程没有在运行,启动它
echo "Starting $process_name..."
sudo service $process_name start
else
echo "$process_name is already running."
fi
# 查找文件
found_file=$(find $directory_to_search -name $file_name)
if [ -n "$found_file" ]; then
# 如果找到了文件,打印文件路径
echo "Found $file_name at $found_file"
else
echo "Did not find $file_name in $directory_to_search"
fi
在使用这个脚本之前,你需要用 chmod +x script.sh
命令来给这个脚本添加可执行权限(假设这个脚本的文件名是 script.sh
)。然后,你可以用 ./script.sh
命令来运行这个脚本。
请注意,这个脚本可能需要 root 权限来启动进程,所以在运行这个脚本时可能需要用 sudo
命令。
这个脚本只是一个例子,你可以根据你的需求来修改进程名、文件名和要搜索的目录。
发布于 2023-07-14 16:52・IP 属地吉林