Shell脚本编程详解及实战示例

Shell脚本是Linux系统中一种强大的编程工具,它允许用户通过编写脚本来自动化执行一系列命令。本文将详细介绍Shell脚本的基本概念、特殊变量、自定义变量、运算符、条件判断、流程控制、读取控制台输入、函数以及常用Shell工具,并通过实战示例展示Shell脚本的编程技巧。

一、Shell脚本基础

Shell脚本是一种用Shell语言编写的程序,它可以直接在命令行中运行,也可以保存在文件中作为可执行文件。Shell脚本通常以 #!/bin/bash 开头,这表示该脚本将使用Bash解释器来执行。

二、特殊变量

在Shell脚本中,有一些特殊的变量用于获取脚本的参数或状态。

  • $0:获取脚本的名称。
  • $1-$9:获取脚本的第一到第九个参数。
  • ${10}:获取脚本的第十个参数(10以上的参数用大括号表示)。
  • $#:统计输入参数的个数。
  • $*$@:获取输入的所有参数。 $* 将所有参数看作一个整体,而 $@ 将每个参数区分对待。
  • $?:获取最后一次执行的命令的返回状态。

示例代码及运行结果

#!/bin/bash
echo "Script Name: $0"
echo "First Argument: $1"
echo "Number of Arguments: $#"
echo "All Arguments (\$*): $*"
echo "All Arguments (\$@): $@"
# 假设此脚本名为test.sh,并传入参数arg1和arg2
# 运行结果:
# Script Name: ./test.sh
# First Argument: arg1
# Number of Arguments: 2
# All Arguments (*): arg1 arg2
# All Arguments (@): arg1 arg2

三、自定义变量

在Shell脚本中,用户可以定义自己的变量来存储数据。

  • 定义变量: 变量名=值(等号两侧不能有空格)。
  • 撤销变量: unset 变量名
  • 声明静态变量: readonly 变量名(不能 unset)。

变量名可以由字母、数字和下划线组成,但不能以数字开头。在Bash中,变量默认都是字符串类型,如果需要进行数值运算,可以使用运算符。

示例代码及运行结果

#!/bin/bash
# 定义变量
myvar="Hello, World!"
# 输出变量值
echo $myvar
# 撤销变量
unset myvar
# 再次输出变量值(将为空)
echo $myvar
# 声明静态变量
readonly staticvar="Static Value"
# 尝试撤销静态变量(将报错)
# unset staticvar
# 运行结果:
# Hello, World!
# (空行)

四、运算符

Shell脚本支持算术运算符,包括加、减、乘、除和取余等。

  • 基本语法: $((运算式))$[运算式]
  • expr 运算符: expr +, -, *, /, %(运算符间要有空格)。

示例代码及运行结果

#!/bin/bash
# 使用$((运算式))进行算术运算
result=$((5 + 3 * 2))
echo "Result: $result"  # 输出:Result: 11
# 使用expr进行算术运算
result_expr=$(expr 5 + 3 * 2)
echo "Result with expr: $result_expr"  # 输出:Result with expr: 11

五、条件判断

Shell脚本支持条件判断,用于根据条件执行不同的命令。

  • 基本语法: [condition](注意condition前后要有空格)。
  • 常用判断条件:整数比较、文件权限比较、文件类型判断等。

示例代码及运行结果

#!/bin/bash
# 整数比较
a=10
b=20
if [ $a -lt $b ]; then
    echo "$a is less than $b"
else
    echo "$a is not less than $b"
fi
# 文件权限判断
file="testfile.txt"
touch $file
if [ -r $file ]; then
    echo "File is readable"
fi
# 删除测试文件
rm $file
# 运行结果:
# 10 is less than 20
# File is readable

六、流程控制

Shell脚本支持多种流程控制结构,包括if判断、case语句、for循环和while循环等。

if判断

#!/bin/bash
# if判断示例
num=15
if [ $num -gt 10 ]; then
    echo "$num is greater than 10"
elif [ $num -eq 10 ]; then
    echo "$num is equal to 10"
else
    echo "$num is less than 10"
fi
# 运行结果:
# 15 is greater than 10

case语句

#!/bin/bash
# case语句示例
var="apple"
case $var in
    "orange")
        echo "Fruit is orange"
        ;;
    "apple")
        echo "Fruit is apple"
        ;;
    *)
        echo "Fruit is unknown"
        ;;
esac
# 运行结果:
# Fruit is apple

for循环

#!/bin/bash
# for循环示例
for i in {1..5}; do
    echo "Number: $i"
done
# 运行结果:
# Number: 1
# Number: 2
# Number: 3
# Number: 4
# Number: 5

while循环

#!/bin/bash
# while循环示例
counter=1
while [ $counter -le 5 ]; do
    echo "Counter: $counter"
    ((counter++))
done
# 运行结果:
# Counter: 1
# Counter: 2
# Counter: 3
# Counter: 4
# Counter: 5

七、读取控制台输入

Shell脚本可以使用 read 命令读取控制台输入。

  • 基本语法: read 选项 参数
  • 常用选项: -p(指定读取值时的提示符)、 -t(指定读取值时的等待时间)。

示例代码及运行结果

#!/bin/bash
# 读取控制台输入示例
echo "Please enter your name:"
read -p "Name: " name
echo "Hello, $name!"
# 运行结果(假设用户输入Alice):
# Please enter your name:
# Name: Alice
# Hello, Alice!

八、函数

Shell脚本支持自定义函数,用于封装一段代码以便重复使用。

  • 基本语法: 函数名() { 命令序列 }
  • 注意事项:函数必须在调用之前声明;函数返回值通过 $? 系统变量获得,也可以使用 return 命令返回特定值。

示例代码及运行结果

#!/bin/bash
# 自定义函数示例
greet() {
    echo "Hello, $1!"
}
# 调用函数并传递参数
greet "Alice"
# 运行结果:
# Hello, Alice!

九、常用Shell工具

Shell脚本中经常使用一些工具来处理文本和数据,如 cutsedawksort 等。

  • cut:用于按列剪切文本数据。
  • sed:流编辑器,用于对文本进行插入、删除、替换等操作。
  • awk:文本分析工具,用于按行读取文件并处理数据。
  • sort:用于对文件进行排序。

示例代码及运行结果(以 awk 为例):

#!/bin/bash
# awk示例:计算文件中第二列的和
cat <<EOF >chengji.txt
张三 40
李四 50
王五 60
EOF
awk '{sum+=\$2} END{print sum}' chengji.txt
# 运行结果:
# 150

十、总结

Shell脚本是Linux系统中一种强大的编程工具,它允许用户通过编写脚本来自动化执行一系列命令。本文介绍了Shell脚本的基本概念、特殊变量、自定义变量、运算符、条件判断、流程控制、读取控制台输入、函数以及常用Shell工具,并通过实战示例展示了Shell脚本的编程技巧。希望这些内容能够帮助读者更好地理解和使用Shell脚本。

原文地址:https://juejin.cn/post/7454224827576188943