Shell脚本基础与条件语句 及变量

1. Shell脚本基础

1.1 Shell的作用

Shell是用户与操作系统内核之间的接口,它提供了一种与操作系统交互的方式,让用户能够通过命令行来执行各种操作。Shell脚本是一种编写在Shell环境下的脚本语言,用于编写一系列的Shell命令,从而实现特定的功能和任务。

1.2 什么是Shell脚本?及构成

Shell脚本是一系列Shell命令的文本化集合,以脚本文件的形式存在。它通常包含一组命令,这些命令会按照顺序执行,以完成特定的任务。一个典型的Shell脚本文件通常包含以下几个部分:

  1. Shebang指令:在脚本文件的第一行,指定要使用的Shell解释器。例如,#!/bin/bash表示使用Bash解释器。

  2. 命令序列:这是脚本的主要内容,包含了一系列要执行的命令,这些命令可以是系统命令、自定义函数等。

常见的Shell

Bash: Bash是基于GNU项目开发的Shell,它是Bourne Shell的改进版。Bash在Linux环境中广泛使用,它提供了命令历史、自动补全、别名、脚本编程等许多强大的功能,使其成为最常见的Shell。

Csh: C Shell的语法类似于C语言,它提供了C语言类似的控制结构。尽管Csh在某些情况下可能更易于理解,但在脚本编程方面,它相对于Bash来说功能较弱。

Tcsh: Tcsh是C Shell的扩展版本,它引入了更多的功能,如命令行编辑、历史替换等。Tcsh在交互式环境下提供了更多的便利,使用户能够更高效地操作。

Sh: Bourne Shell是Unix系统上的原始Shell,尽管它在功能上相对较简单,但它的语法和特性为后来的Shell铺平了道路。然而,由于Bash的广泛使用,Bourne Shell在很大程度上已被替代。

nologin : nologin Shell并不是一种通用的Shell,而是一种特殊的Shell设置,用于禁止用户登录系统。当将用户的Shell设置为nologin时,用户将无法通过登录操作进入系统,而只能通过其他方式进行操作,如SSH密钥认证或执行特定命令。

1.3Shell脚本的用途

Shell脚本在Unix/Linux系统中具有广泛的用途,它们可以用于自动化、批处理、系统管理、数据处理等多种任务。以下是一些常见的Shell脚本用途:

  1. 自动化任务: Shell脚本可以用来自动执行重复性任务,如备份文件、定期清理临时文件、定时发送邮件等。这可以减轻手动操作的负担,提高工作效率。

  2. 系统管理: Shell脚本是系统管理员的得力助手。管理员可以使用脚本来监控系统状态、启动/停止服务、配置网络设置、管理用户账户等。

  3. 批处理: 批处理脚本可以用来在一次运行中执行多个命令,这在需要一次性完成多个任务时非常有用。比如,你可以编写一个脚本来自动部署应用程序并配置环境。

  4. 日志处理: Shell脚本可以用来分析和处理日志文件。你可以编写脚本来提取特定的日志信息、生成报告、检测异常情况等。

  5. 数据处理: Shell脚本可以用来处理文本文件,如提取特定数据、格式化输出、合并文件、分割文件等。这在数据处理和数据转换时非常有用。

  6. 备份和恢复: 通过编写脚本,你可以实现文件和目录的自动备份和恢复操作。这可以确保数据的安全性,并在需要时快速进行恢复。

  7. 定时任务: 使用cron等工具,你可以编写Shell脚本来安排定时任务的执行。这对于定期执行任务、生成报告等非常有用。

  8. 监控和警报: Shell脚本可以用来监控系统资源、服务状态和性能指标。当出现异常情况时,脚本可以自动发送警报通知管理员。

  9. 自定义工具: 你可以根据特定需求编写自定义工具,以便执行特定任务。这些工具可以根据你的需求定制,从而更好地适应你的工作流程。

  10. 用户交互界面: 虽然Shell通常是一个命令行界面,但你仍然可以编写脚本来创建用户友好的交互式界面,以指导用户完成特定操作。

总之,Shell脚本是一种强大的工具,可以在Unix/Linux环境中完成各种任务,从简单的自动化操作到复杂的系统管理和数据处理。它们可以提高效率、减少错误并使任务更容易自动化和批处理。

1.3 脚本执行逻辑及执行方式

当你运行一个Shell脚本时,系统会启动Shell解释器,然后逐行解释和执行脚本中的命令。脚本的执行方式可以有以下几种:

  • 直接运行:在命令行中输入./script.sh来运行脚本,前提是脚本具有执行权限。

  • 通过Shell解释器运行:在命令行中输入bash script.sh来通过解释器运行脚本。

1.4 脚本错误调试

在编写和运行Shell脚本时,错误是不可避免的。为了找出问题并进行调试,你可以采取以下方法:

  • echo语句: 在脚本的关键步骤添加echo语句,输出中间结果,以便观察程序执行的过程。

  • set -x: 在脚本的开头添加set -x,可以使Shell在执行每条命令之前输出该命令。用完后,可以使用set +x关闭。

  • 错误信息输出: 当脚本发生错误时,Shell通常会输出错误信息,指出出错的位置和原因。

2. 重定向与管道符

2.1 重定向

重定向是将命令的输出从默认的位置(通常是终端)改为其他位置,比如文件。常见的重定向操作符包括:

  • >:将命令的输出覆盖到指定文件中,如果文件不存在,则创建该文件。

  • >>:将命令的输出追加到指定文件末尾。

2.2 多行重定向

有时候你可能需要将多行文本一次性写入文件。这可以通过以下方式实现:

cat > myfile.txt <<EOF
This is line 1.
This is line 2.
EOF

2.3 管道符

管道符(|)允许将一个命令的输出作为另一个命令的输入,从而实现两个或多个命令的组合。(需要命令支持管道符)例如:

ls | grep ".txt"

3. 变量

3.1 变量基础

在Shell脚本中,变量用于存储数据,可以是字符串、数字等。变量名通常由字母、数字和下划线组成,但不能以数字开头。

  • 赋值:使用=号来给变量赋值。
name="Alice"
age=25
  • 引用变量:使用$符号来引用变量的值。
echo "$变量名"echo  "$name"
输出Alice

3.1.1 命名要求

变量名是区分大小写的,应该使用大写字母和下划线的组合来命名,以提高代码的可读性。

  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

3.1.2 read -p

read命令用于从用户获取输入,-p参数可以在获取输入前输出提示信息。

read -p "输入提示: " 自定义变量
echo " $自定义变量"   输出变量

3.1.3 变量作用范围

默认情况下,变量只在其定义的Shell脚本中有效,子Shell无法访问父Shell中的变量。

3.1.4 整数的运算

Shell脚本支持整数运算,使用$(( ))语法。

result=$((5 + 3))
echo "Result: $result"

3.2 环境变量

3.2.1 环境变量

环境变量是系统级别的变量,用于保存系统和用户的配置信息。常见的环境变量包括PATH(命令搜索路径)、HOME(用户主目录)等。

3.2.2 环境变量的全局配置文件

在Unix/Linux系统中,环境变量可以在全局配置文件(如/etc/profile/etc/environment)中进行设置

3.2.3 只读变量

你可以使用readonly命令将变量设置为只读,这意味着无法在脚本中修改该变量的值。

readonly my_var="This is read-only."

3.2.4 位置变量

位置变量是特殊的变量,用于引用命令行参数。$0表示脚本本身,$1$2等表示传递给脚本的参数。

4. 预定义(状态)变量

Shell脚本中有一些特殊的预定义变量,用于获取有关脚本执行状态和环境的信息。

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字
  • $$:当前进程id
  • " ":弱引用,可以识别变量
  • ' ':强引用。不可识别变量

数值变量的运算及特殊变量

在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算
整数值的运算主要通过内部命令 expr 进行
运算符与变量之间必须有至少一个空格。

运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
运算符号:$ (()) 和$[]
运算命令:expr和let
运算工具:bc(系统自带)

expr命令(不仅可以运算,还支持输出到屏幕)
常用的 几种运算符如下所述。
+:加法运算。
-:减法运算。
\`:乘法运算,注意不能仅使用“”符号,否则将被当成文件通配符。
/:除法运算。
%:求模运算,又称为取余运算,用来计算数值相除后的余数。

便捷搭建DHCP服务器脚本

#!/bin/bash

#检查是否以 root 权限运行脚本

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root."
   exit 1
fi

#安装 DHCP 服务器软件

yum install -y dhcp

#要求用户输入网络地址、子网掩码、起始和结束IP地址以及网关地址

read -p "输入网段如( 192.168.1.0): " network_address
read -p "输入子网掩码如 ( 255.255.255.0): " subnet_mask
read -p "输入起始IP: " start_ip
read -p "输入终止IP: " end_ip
read -p "输入网关: " gateway
read -p "输入DNS,如(8.8.8.8)若有多个(8.8.8.8, 4.4.4.4)" dns_ip

#配置 DHCP 服务器

cat > /etc/dhcp/dhcpd.conf <<EOL
subnet $network_address netmask $subnet_mask {
  range $start_ip $end_ip;
  option domain-name-servers $dns_ip;
  option routers $gateway;
  option subnet-mask $subnet_mask;
  option broadcast-address $network_address;
  default-lease-time 600;
  max-lease-time 7200;
}
EOL

#配置 DHCP 服务器监听的网络接口

echo "INTERFACESv4=\"eth0\"" >> /etc/sysconfig/dhcpd:

#启动 DHCP 服务器

systemctl start dhcpd
systemctl enable dhcpd
systemctl restart dhcpd 
echo "DHCP server has been set up and started."

exit 0

已上传

条件语句

条件语句在Shell脚本中用于根据条件的真假来执行不同的代码块。这样你可以根据特定情况来做出决策,从而实现更灵活的脚本。

在Shell脚本中,最常见的条件语句有if语句和case语句。让我们深入了解一下这些条件语句的用法:

1. if语句

if语句允许你根据条件的真假执行不同的代码块。

if [ 条件 ]; then
    # 条件为真时执行的代码块
else
    # 条件为假时执行的代码块
fi

例如,以下是一个用于判断年龄是否成年的例子:

age=20

if [ $age -ge 18 ]; then
    echo "You are an adult."
else
    echo "You are a minor."
fi

在这个例子中,如果年龄大于等于18,将输出"You are an adult.“,否则输出"You are a minor.”。

2. case语句

case语句允许你根据不同的值匹配不同的代码块。

casein
    模式1)
        # 匹配模式1时执行的代码块
        ;;
    模式2)
        # 匹配模式2时执行的代码块
        ;;
    *)
        # 如果没有匹配的模式时执行的代码块
        ;;
esac

例如,以下是一个用于判断水果类型的例子:

fruit="apple"

case $fruit in
    "apple")
        echo "It's an apple."
        ;;
    "banana")
        echo "It's a banana."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac

在这个例子中,根据变量$fruit的值来匹配不同的情况,如果是"apple",则输出"It’s an apple.“,如果是"banana”,则输出"It’s a banana.“,否则输出"Unknown fruit.”。

在Shell脚本中,你可以使用不同的运算符来比较整数数值。以下是常见的比较运算符及其用法:

比较数值大小

  1. 等于(-eq): 检查两个数值是否相等。
if [ $a -eq $b ]; then
    echo "$a is equal to $b"
fi
  1. 不等于(-ne): 检查两个数值是否不相等。
if [ $a -ne $b ]; then
    echo "$a is not equal to $b"
fi
  1. 大于(-gt): 检查一个数值是否大于另一个数值。
if [ $a -gt $b ]; then
    echo "$a is greater than $b"
fi
  1. 小于(-lt): 检查一个数值是否小于另一个数值。
if [ $a -lt $b ]; then
    echo "$a is less than $b"
fi
  1. 大于等于(-ge): 检查一个数值是否大于或等于另一个数值。
if [ $a -ge $b ]; then
    echo "$a is greater than or equal to $b"
fi
  1. 小于等于(-le): 检查一个数值是否小于或等于另一个数值。
if [ $a -le $b ]; then
    echo "$a is less than or equal to $b"
fi

在这些比较运算符中,$a$b是待比较的整数数值。如果比较条件为真,将执行相应的代码块。你可以根据需要组合使用这些比较运算符,以便根据条件执行不同的操作。

以下是一个完整的例子,演示了如何在Shell脚本中比较整数数值:

a=10
b=5

if [ $a -gt $b ]; then
    echo "$a is greater than $b"
else
    echo "$a is not greater than $b"
fi

这个例子中,因为 a 大于 a大于 a大于b,所以会输出"10大于5"。

比较字符串

在Shell脚本中,你可以使用不同的运算符来比较字符串。以下是常见的字符串比较运算符及其用法:

  1. 等于(=): 检查两个字符串是否相等。
if [ "$str1" = "$str2" ]; then
    echo "Strings are equal"
fi
  1. 不等于(!=): 检查两个字符串是否不相等。
if [ "$str1" != "$str2" ]; then
    echo "Strings are not equal"
fi
  1. 比较大小(< 和 >): 对字符串进行字典顺序的比较。注意,这种比较通常用于判断字符串的字典顺序,而不是长度。
if [ "$str1" \< "$str2" ]; then
    echo "str1 is less than str2"
fi

if [ "$str1" \> "$str2" ]; then
    echo "str1 is greater than str2"
fi
  1. 比较大小(-lt 和 -gt): 这些运算符比较字符串的长度,而不是字典顺序。
if [ ${#str1} -lt ${#str2} ]; then
    echo "str1 is shorter than str2"
fi

if [ ${#str1} -gt ${#str2} ]; then
    echo "str1 is longer than str2"
fi

在这些字符串比较运算符中,$str1$str2是待比较的字符串。需要注意的是,字符串比较时需要使用双引号将变量括起来,以避免由于字符串中的空格等问题引起的错误。

以下是一个完整的例子,演示了如何在Shell脚本中进行字符串比较:

str1="hello"
str2="world"

if [ "$str1" = "$str2" ]; then
    echo "Strings are equal"
else
    echo "Strings are not equal"
fi

在这个例子中,由于str1str2的值不相等,所以会输出"Strings are not equal"。

逻辑测试

在Shell脚本中,你可以使用逻辑运算符进行逻辑测试,并利用短路运算来优化条件判断。逻辑运算符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。

短路运算指的是在某些情况下,如果已经能够确定整个表达式的结果,就不再计算剩余的部分,从而提高效率。

以下是逻辑测试和短路运算的示例:

1. 逻辑与(&&)

逻辑与运算符(&&)用于检查两个条件是否都为真。如果第一个条件为假,整个表达式就会被判断为假,且不会执行后续的条件判断。

if [ $age -ge 18 ] && [ "$status" = "active" ]; then
    echo "You are an active adult."
fi

在这个例子中,如果age大于等于18且status等于"active",将输出"You are an active adult."。如果第一个条件不满足,将不会执行第二个条件。

2. 逻辑或(||)

逻辑或运算符(||)用于检查两个条件是否有至少一个为真。如果第一个条件为真,整个表达式就会被判断为真,且不会执行后续的条件判断。

if [ "$user_role" = "admin" ] || [ "$user_role" = "superadmin" ]; then
    echo "Access granted."
fi

在这个例子中,如果user_role等于"admin"或"superadmin",将输出"Access granted."。如果第一个条件满足,将不会执行第二个条件。

3. 逻辑非(!)

逻辑非运算符(!)用于反转条件的结果。如果条件为真,则!会将其结果设为假,反之亦然。

if ! [ -e "$file_path" ]; then
    echo "File does not exist."
fi

在这个例子中,如果file_path对应的文件不存在,将输出"File does not exist."。!运算符反转了-e运算符的结果。

通过合理地利用逻辑运算符和短路运算,你可以更有效地编写具有复杂逻辑的Shell脚本,提高代码的可读性和性能。

结语

Shell脚本编程是一个强大的工具,可以在Unix/Linux系统中自动化任务、进行系统管理、数据处理等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值