MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Bash基础入门与环境配置

2024-05-117.6k 阅读

什么是 Bash

Bash,即 Bourne Again SHell,是 Unix 操作系统和类 Unix 操作系统(如 Linux)中最常用的 shell 之一。它是一种命令语言和脚本语言,允许用户与操作系统进行交互,执行各种任务,从简单的文件操作到复杂的系统管理任务。Bash 继承了 Bourne Shell(sh)的基本语法,并在此基础上添加了许多增强功能,使其成为一个功能强大且灵活的工具。

Bash 的历史

Bash 由 Brian Fox 为 GNU 项目开发,首次发布于 1989 年。其目的是创建一个符合 POSIX 标准的 shell,作为 Unix 系统中 Bourne Shell 的自由替代方案。随着时间的推移,Bash 不断发展和完善,成为了大多数 Linux 发行版的默认 shell,以及 macOS 系统上的标准 shell 之一。

Bash 的作用

  1. 交互式使用:用户可以在终端中直接输入 Bash 命令,与操作系统进行交互。例如,查看文件列表、切换目录、执行程序等。
  2. 脚本编写:Bash 允许将一系列命令组合成一个脚本文件,通过执行脚本来自动化复杂的任务。这在系统管理、软件开发、数据处理等领域都有广泛应用。

环境配置

Linux 系统下的 Bash 环境

大多数 Linux 发行版默认已经安装了 Bash,并且将其设置为用户的默认 shell。可以通过以下命令来确认 Bash 的版本:

bash --version

如果系统没有安装 Bash,可以通过系统的包管理器进行安装。例如,在基于 Debian 或 Ubuntu 的系统上,可以使用以下命令:

sudo apt-get install bash

在基于 Red Hat 或 CentOS 的系统上,可以使用以下命令:

sudo yum install bash

macOS 系统下的 Bash 环境

macOS 系统默认使用的是 Bash 3.2。如果需要使用更新版本的 Bash,可以通过 Homebrew 进行安装。首先,确保已经安装了 Homebrew。如果没有安装,可以使用以下命令进行安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完成后,使用以下命令安装最新版本的 Bash:

brew install bash

安装完成后,可以将新安装的 Bash 设置为默认 shell。首先,找到新安装的 Bash 的路径:

which bash

假设路径为 /usr/local/bin/bash,然后将其添加到 /etc/shells 文件中:

sudo sh -c 'echo /usr/local/bin/bash >> /etc/shells'

最后,将新安装的 Bash 设置为默认 shell:

chsh -s /usr/local/bin/bash

Windows 系统下的 Bash 环境

在 Windows 系统上,可以通过 Windows Subsystem for Linux(WSL)来运行 Bash。首先,确保 Windows 系统版本支持 WSL。然后,打开 PowerShell 并以管理员身份运行以下命令来启用 WSL:

wsl --install

执行该命令后,系统会自动下载并安装默认的 Linux 发行版(通常是 Ubuntu)。安装完成后,在开始菜单中找到安装的 Linux 发行版并打开,按照提示设置用户名和密码,即可进入 Bash 环境。

Bash 基础语法

命令基本格式

Bash 命令的基本格式为:

command [options] [arguments]

其中,command 是要执行的命令名称,options 是命令的选项,用于修改命令的行为,arguments 是命令的参数,通常是命令操作的对象。例如,要列出当前目录下的文件和目录列表,可以使用 ls 命令:

ls -l

这里,ls 是命令,-l 是选项,表示以长格式列出文件和目录信息。

通配符

通配符是一种特殊字符,用于匹配文件名或目录名的模式。常见的通配符有:

  1. *:匹配任意字符序列,包括空字符序列。例如,*.txt 匹配所有以 .txt 结尾的文件名。
ls *.txt
  1. ?:匹配任意单个字符。例如,file?.txt 匹配文件名以 file 开头,紧跟一个任意字符,然后以 .txt 结尾的文件。
ls file?.txt
  1. [ ]:匹配括号内的任意一个字符。例如,[abc].txt 匹配文件名是 a.txtb.txtc.txt 的文件。
ls [abc].txt

还可以使用 [ - ] 表示字符范围。例如,[a - z].txt 匹配文件名是单个小写字母开头,以 .txt 结尾的文件。

ls [a - z].txt

变量

  1. 定义变量:在 Bash 中,可以使用以下方式定义变量:
variable_name=value

注意,变量名和等号之间不能有空格。例如:

name=John
  1. 使用变量:要使用变量的值,可以在变量名前加上 $ 符号。例如:
echo $name
  1. 环境变量:环境变量是由系统或用户设置的变量,用于影响系统或程序的行为。常见的环境变量有 PATHHOMEUSER 等。可以使用 echo 命令查看环境变量的值,例如:
echo $PATH
  1. 只读变量:可以使用 readonly 命令将变量设置为只读,使其值不能被修改。例如:
readonly name
  1. 删除变量:可以使用 unset 命令删除变量,例如:
unset name

算术运算

Bash 支持基本的算术运算。可以使用 let 命令或 (( )) 结构来进行算术运算。例如:

a=5
b=3
let result=a + b
echo $result

或者使用 (( )) 结构:

a=5
b=3
((result=a + b))
echo $result

Bash 支持的算术运算符包括 +(加法)、-(减法)、*(乘法)、/(除法)、%(取模)等。

条件判断

  1. test 命令test 命令用于进行条件判断。例如,判断文件是否存在:
if test -f file.txt; then
    echo "文件存在"
else
    echo "文件不存在"
fi

test 命令支持多种测试条件,如 -d 用于判断是否为目录,-e 用于判断文件或目录是否存在等。 2. [ ] 结构[ ]test 命令的简化形式,功能相同。例如:

if [ -f file.txt ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi

注意,[ ] 内的表达式与 [ ] 之间需要有空格。 3. 复合条件判断:可以使用 &&(逻辑与)和 ||(逻辑或)来组合多个条件。例如:

if [ -f file1.txt ] && [ -f file2.txt ]; then
    echo "两个文件都存在"
fi

循环

  1. for 循环for 循环用于对一组值进行迭代。例如,遍历一个文件列表:
for file in *.txt; do
    echo $file
done

还可以使用 {start..end} 来生成一个数字序列进行循环:

for i in {1..5}; do
    echo $i
done
  1. while 循环while 循环在条件为真时重复执行一组命令。例如,读取文件的每一行:
while read line; do
    echo $line
done < file.txt
  1. until 循环until 循环在条件为假时重复执行一组命令,与 while 循环相反。例如:
a=0
until [ $a -ge 5 ]; do
    echo $a
    ((a++))
done

脚本编写基础

创建和执行脚本

  1. 创建脚本文件:可以使用文本编辑器(如 vinano 等)创建一个脚本文件。例如,使用 nano 创建一个名为 test.sh 的脚本文件:
nano test.sh

在文件中输入以下内容:

#!/bin/bash
echo "这是一个 Bash 脚本"

第一行 #!/bin/bash 称为 shebang,用于指定脚本使用的 shell。 2. 执行脚本:有两种常见的方法来执行脚本。 - 赋予执行权限并直接运行:首先,使用 chmod 命令赋予脚本执行权限:

chmod +x test.sh

然后,直接运行脚本:

./test.sh
- **通过 `bash` 命令运行**:不需要赋予执行权限,直接使用 `bash` 命令运行脚本:
bash test.sh

脚本中的参数传递

脚本可以接受命令行参数。在脚本中,可以使用 $1$2 等变量来访问这些参数。例如,创建一个脚本 args.sh

#!/bin/bash
echo "第一个参数: $1"
echo "第二个参数: $2"

执行脚本并传递参数:

./args.sh apple banana

输出结果为:

第一个参数: apple
第二个参数: banana

还可以使用 $@ 表示所有参数,$# 表示参数的个数。例如:

#!/bin/bash
echo "参数个数: $#"
echo "所有参数: $@"

执行脚本:

./args.sh apple banana cherry

输出结果为:

参数个数: 3
所有参数: apple banana cherry

函数

  1. 定义函数:在 Bash 中,可以使用以下方式定义函数:
function_name() {
    commands
}

例如,定义一个简单的函数来输出问候语:

greet() {
    echo "你好,$1"
}
  1. 调用函数:定义函数后,可以使用函数名来调用它,并传递参数:
greet John

函数内部也可以使用 return 语句返回一个值。例如:

add() {
    ((result=$1 + $2))
    return $result
}
add 3 5
echo "结果: $?"

这里,$? 用于获取上一个命令(包括函数)的返回值。

高级 Bash 特性

输入输出重定向

  1. 输出重定向:可以使用 > 符号将命令的标准输出重定向到文件中。例如,将 ls 命令的输出保存到 list.txt 文件中:
ls > list.txt

如果文件已存在,> 会覆盖文件内容。如果要追加内容,可以使用 >> 符号:

echo "这是追加的内容" >> list.txt
  1. 输入重定向:使用 < 符号可以将文件内容作为命令的输入。例如,将 file.txt 的内容作为 sort 命令的输入:
sort < file.txt
  1. 错误输出重定向:使用 2> 符号可以将命令的错误输出重定向到文件中。例如,运行一个不存在的命令,并将错误信息保存到 error.txt 文件中:
nonexistent_command 2> error.txt

还可以使用 &> 将标准输出和错误输出都重定向到同一个文件:

command &> output.txt

管道

管道(|)用于将一个命令的输出作为另一个命令的输入。例如,将 ls 命令的输出传递给 grep 命令,以查找包含特定字符串的文件名:

ls | grep "txt"

可以连接多个命令形成更复杂的管道。例如,统计当前目录下所有 Python 文件的行数:

ls *.py | xargs wc -l

进程管理

  1. 后台运行进程:在命令末尾加上 & 符号,可以将命令在后台运行。例如,运行一个长时间运行的脚本 long_running.sh 在后台:
./long_running.sh &
  1. 查看后台进程:使用 jobs 命令可以查看当前终端中运行的后台进程列表:
jobs
  1. 将后台进程切换到前台:使用 fg 命令可以将后台进程切换到前台运行。例如,将编号为 1 的后台进程切换到前台:
fg 1
  1. 终止进程:使用 kill 命令可以终止进程。首先,使用 ps 命令找到进程的 PID(进程 ID),然后使用 kill 命令终止进程。例如:
ps -ef | grep long_running.sh
kill <PID>

信号处理

Bash 可以处理各种信号。例如,当用户按下 Ctrl+C 时,会发送 SIGINT 信号。可以在脚本中使用 trap 命令来捕获并处理信号。例如:

#!/bin/bash
trap 'echo "捕获到 SIGINT 信号,脚本即将退出"' SIGINT
while true; do
    echo "运行中..."
    sleep 1
done

在这个脚本中,当用户按下 Ctrl+C 时,会输出提示信息并退出脚本。

案例实践

简单的文件备份脚本

假设要创建一个脚本来备份指定目录下的所有文件到另一个目录,并记录备份时间。可以编写如下脚本 backup.sh

#!/bin/bash
source_dir="/path/to/source"
target_dir="/path/to/target"
backup_time=$(date +%Y%m%d%H%M%S)
backup_dir="$target_dir/backup_$backup_time"
mkdir -p $backup_dir
cp -r $source_dir/* $backup_dir
echo "备份完成,时间: $backup_time" > $backup_dir/backup_log.txt

使用 chmod +x backup.sh 赋予执行权限后,运行脚本即可完成备份操作。

系统资源监控脚本

创建一个脚本来定期监控系统的 CPU 和内存使用情况,并将结果保存到文件中。脚本 monitor.sh 如下:

#!/bin/bash
log_file="system_monitor.log"
while true; do
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
    mem_usage=$(free -h | awk '/Mem:/{print $3 "/" $2}')
    echo "$(date +%Y-%m-%d %H:%M:%S) CPU 使用率: $cpu_usage% 内存使用率: $mem_usage" >> $log_file
    sleep 60
done

运行该脚本后,每 60 秒会记录一次系统的 CPU 和内存使用情况到 system_monitor.log 文件中。

自动化部署脚本

在软件开发中,常常需要自动化部署过程。假设项目代码托管在 Git 仓库,服务器使用的是 Linux 系统,可以编写如下自动化部署脚本 deploy.sh

#!/bin/bash
project_dir="/path/to/project"
cd $project_dir
git pull origin master
# 假设项目使用 Python 和 pip 安装依赖
pip install -r requirements.txt
# 重启相关服务
sudo systemctl restart project_service
echo "部署完成"

通过执行该脚本,可以自动拉取最新代码,安装依赖,并重启相关服务,实现自动化部署。

通过以上内容,你已经对 Bash 的基础入门和环境配置有了较为深入的了解,并且通过案例实践进一步掌握了如何在实际场景中运用 Bash 来解决问题。随着不断的学习和实践,你将能够更加熟练地使用 Bash 完成各种复杂的任务。