The GNU Bourne-Again SHell : BASH

一小时实践入门 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 的知识和技能:

  1. 基本的计算机科学知识:理解如何使用计算机和基本的计算机科学概念(如文件系统,进程,输入/输出等)会有所帮助。
  2. 基本的命令行接口(CLI)知识:Bash 是一个命令行接口,因此熟悉如何在命令行环境中工作是很有帮助的。这包括理解命令行的基本概念(如命令,参数,选项等)和常见的命令行任务(如导航文件系统,管理文件和目录,运行程序等)。
  3. Linux或UNIX系统:Bash 最初是为 Unix 系统开发的,现在它在 Linux 和 macOS(基于 Unix)上也非常普遍。如果你计划在这些系统上使用 Bash,那么对它们有一些基本的了解将会很有帮助。(macOS-->freeBSD-->unix; Linux-->unix)
  4. 基本的编程知识:虽然 Bash 不需要你是一位经验丰富的程序员,但是理解一些基本的编程概念(如变量,控制流,数据类型,函数等)会使学习 Bash 更容易。
  5. 文本编辑器:编写 Bash 脚本需要一个文本编辑器。你可以使用任何你喜欢的文本编辑器,但是一些文本编辑器(如 Vim 或 Emacs)在命令行环境中工作得特别好。

除了这些,你需要一个可以运行 Bash 的系统。这可以是一个 Linux 或 Unix 系统,或者如果你在 Windows 上,你可以使用 Windows Subsystem for Linux(WSL)

实践计划

了解你已经有的基础之后,我为你制定了一小时的 Bash 学习计划。这个计划以实践项目为目标,可以帮助你快速理解和运用 Bash 的基本概念和语法。

项目目标:自动化脚本

编写一个 Bash 脚本,用于自动化一些常见的系统任务,如创建文件和目录、查找文件、检查进程状态等。

学习计划:

  1. 了解 Bash 和 Shell 的基本概念(10分钟)
    了解什么是 Shell,什么是 Bash,Bash 和其他 Shell(如 sh、zsh)的区别是什么,以及为什么我们需要 Bash。
  2. 学习 Bash 的基本语法(20分钟)
    学习如何在 Bash 中使用变量、数组、循环(for、while)和条件语句(if、case)。学习如何定义和使用函数,以及如何处理输入参数。
  3. 学习 Bash 中的文件和目录操作(10分钟)
    学习如何在 Bash 中创建、读取、写入、移动、复制和删除文件和目录。学习如何使用 globbing(通配符)来匹配文件和目录。
  4. 学习 Bash 中的进程管理(10分钟)
    学习如何在 Bash 中启动、停止、监控和杀死进程。
  5. 编写自动化脚本(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)上最常见的命令行界面,它有几个主要的优点使得我们需要使用它:

  1. 自动化:Bash 可以执行一系列的命令,这些命令可以写入到脚本中,并在需要的时候执行。这种自动化可以极大地提高效率,特别是对于重复的任务。
  2. 批处理:Bash 能处理大量的文件和数据,你可以用它来批量重命名文件,或者在大量的文本文件中查找特定的内容。
  3. 系统管理:Bash 提供了一种简单的方式来执行系统管理任务,比如管理用户账户,更新系统,管理服务和进程等。
  4. 强大的命令行工具:Unix 和 Unix-like 系统提供了大量的命令行工具,比如 grep、awk、sed、find 等。这些工具在 Bash 中可以灵活地使用,并且可以组合起来执行复杂的任务。
  5. 脚本编程:Bash 也是一种编程语言,它有条件语句,循环语句,函数等编程元素。你可以写 Bash 脚本来完成更复杂的任务。
  6. 跨平台:几乎所有的 Unix-like 系统都支持 Bash,包括 macOS 和大多数的 Linux 发行版。Windows 10 的 WSL(Windows Subsystem for Linux)也支持 Bash。这意味着你可以在不同的系统上使用同样的 Bash 脚本。
  7. 开源和免费: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 支持 forwhile 循环。

以下是 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 支持 ifcase 条件语句。

以下是 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 中,我们可以使用一些内置的命令来操作文件和目录:

  1. 创建文件:我们可以使用 touch 命令来创建一个新的空文件,例如:
    touch file.txt
    这将会创建一个名为 file.txt 的新文件。
  2. 读取文件:我们可以使用 cat 命令来读取一个文件的内容,例如:
    cat file.txt
    这将会打印出 file.txt 文件的内容。
  3. 写入文件:我们可以使用重定向 (>) 来将输出写入到一个文件,例如:
    echo "Hello, world!" > file.txt
    这将会将 "Hello, world!" 写入到 file.txt 文件。注意这会覆盖原有文件的内容。如果你想在文件的末尾添加内容,可以使用追加重定向 (>>),例如:
    echo "Hello, again!" >> file.txt
    这将会在 file.txt 文件的末尾添加 "Hello, again!"。
  4. 移动文件:我们可以使用 mv 命令来移动一个文件,例如:
    mv file.txt dir/
    这将会将 file.txt 文件移动到 dir/ 目录下。
  5. 复制文件:我们可以使用 cp 命令来复制一个文件,例如:
    cp file.txt file_copy.txt
    这将会创建一个 file.txt 文件的副本,名为 file_copy.txt
  6. 删除文件:我们可以使用 rm 命令来删除一个文件,例如:
    rm file.txt
    这将会删除 file.txt 文件。

对于目录,我们可以使用类似的命令:

  1. 创建目录:我们可以使用 mkdir 命令来创建一个新的目录,例如:
    mkdir dir
    这将会创建一个名为 dir 的新目录。
  2. 移动目录:我们可以使用 mv 命令来移动一个目录,和移动文件的方式一样。
  3. 复制目录:我们可以使用 cp 命令来复制一个目录,但需要加上 -r (递归)选项,例如:
    cp -r dir dir_copy
    这将会创建一个 dir 目录的副本,名为 dir_copy
  4. 删除目录:我们可以使用 rm 命令来删除一个目录,但需要加上 -r (递归)选项,例如:
    rm -r dir
    这将会删除 dir 目录。

以上是在 Bash 中操作文件和目录的基本命令。

使用 globbing(通配符)来匹配文件和目录

在 Bash 中,我们可以使用 globbing(通配符)来匹配文件和目录的名称。以下是一些常用的 globbing 字符:

  1. *:匹配任意多个(包括 0 个)字符。例如,*.txt 会匹配所有以 .txt 结尾的文件。
  2. ?:匹配任意一个字符。例如,?.txt 会匹配所有只有一个字符并且以 .txt 结尾的文件,如 a.txt1.txt 等。
  3. []:匹配括号中的任意一个字符。例如,[abc].txt 会匹配 a.txtb.txtc.txt
  4. {}:匹配大括号中的任意一个字符串。例如,{a,b,c}.txt 会匹配 a.txtb.txtc.txt
  5. **:如果启用了 globstar 选项(通过 shopt -s globstar 命令),** 可以匹配任意多个目录。例如,**/*.txt 会匹配所有目录下的以 .txt 结尾的文件。

这些 globbing 字符可以组合使用,例如,*.[ch] 会匹配所有以 .c.h 结尾的文件,file?.* 会匹配所有以 file 开头并且只有一个字符的文件,如 file1.txtfile2.txt 等。

注意,globbing 只能匹配已经存在的文件和目录,它不能匹配不存在的路径。此外,如果一个文件或目录的名称以 . 开头,那么这个文件或目录默认是隐藏的,不会被 * 匹配,需要使用 .* 来匹配。

进程管理

在 Bash 中,我们可以使用一些内置的命令来管理进程,比如,我们可以使用 sleep 命令来创建一个简单的进程:

  1. 启动进程:我们可以在命令行中输入一个命令来启动一个进程,例如:
    sleep 100
    这将会启动一个进程,这个进程将会在 100 秒后结束。如果我们想在后台启动一个进程,我们可以在命令后面加上 &,例如:
    sleep 100 &
    这将会在后台启动一个进程,这个进程将会在 100 秒后结束。
  2. 停止进程:我们可以使用 kill 命令来停止一个进程。kill 命令需要一个进程 ID(PID)作为参数。我们可以使用 ps 命令来查找 PID,例如:
    ps aux | grep sleep
    这将会显示所有关于 sleep 的进程。然后我们可以使用 kill 命令来停止一个进程,例如:
    kill 12345
    这将会停止 PID 为 12345 的进程。
    如果一个进程不响应 kill 命令,我们可以使用 -9 选项来强制停止一个进程,例如:
    kill -9 12345
    这将会强制停止 PID 为 12345 的进程。
  3. 监控进程:我们可以使用 top 命令来监控进程。top 命令会显示系统的实时状态,包括 CPU 使用率、内存使用率、运行的进程等。我们可以在 top 的界面中按 k 来停止一个进程,按 r 来重启一个进程。
    如果我们想查找特定的进程,我们可以使用 ps 命令,如上面所述。
  4. 杀死进程:杀死进程的操作与停止进程基本相同,通常使用 killkill -9 命令。

以上是在 Bash 中管理进程的基本命令。

pstop 都是在 Unix 和 Unix-like 系统(包括 Linux)中用于查看进程信息的常用命令,但它们的工作方式和用途有所不同。

  1. ps 命令ps 是 "process status" 的缩写,这个命令用于显示当前进程的状态。它提供了关于进程(如进程 ID、当前状态、CPU 使用率、命令行等)的静态视图。默认情况下,ps 只显示当前 shell 和与之关联的进程,但你可以通过选项(如 -e-A)来显示所有进程。ps 是一个 "一次性" 的命令,意思是它只会运行一次,然后显示那个时刻的进程信息。
  2. top 命令top 是 "table of processes" 的缩写,这个命令用于动态显示进程信息。top 提供了一个实时的、交互式的视图,显示了系统中的进程并按 CPU 使用率排序。你可以在 top 的界面中进行操作,例如发送信号给进程。top 是一个 "持续性" 的命令,意思是它会持续运行,并实时更新显示的信息。

总的来说,pstop 都能提供进程的信息,但 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 属地吉林

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值