【shell】高级 Shell 脚本技术

高级 Shell 脚本技术:使用 Bash 自动执行复杂任务
转:
https

使用内置命令

尽可能利用内置 shell 命令而不是外部二进制文件。内置命令执行速度更快,因为它们不需要加载外部进程。例如,使用[[ ]]for 条件而不是[ ]or test。

# Inefficient
if [ "$var" -eq 1 ]; then
    echo "Equal to 1"
fi

# Efficient
if [[ "$var" -eq 1 ]]; then
    echo "Equal to 1"
fi

最小化子壳层

子 shell 的性能开销很大。尽可能使用内置命令或参数扩展来避免使用子 shell。

# Inefficient
output=$(cat file.txt)

# Efficient
output=$(<file.txt)

使用数组来存储大量数据

处理大量数据时,数组比多个变量更高效且更易于管理。

# Inefficient
item1="apple"
item2="banana"
item3="cherry"

# Efficient
items=("apple" "banana" "cherry")
for item in "${items[@]}"; do
    echo "$item"
done

启用 Noclobber

为了防止意外覆盖文件,请使用该noclobber选项。这在生成临时文件的脚本中特别有用。

set -o noclobber

使用函数

函数允许您封装和重用代码,使脚本更简洁并减少冗余。

function greet() {
    local name=$1
    echo "Hello, $name"
}

greet "Alice"
greet "Bob"

高效的文件操作

执行文件操作时,使用有效的技术来最大限度地减少资源使用。

# Inefficient
while read -r line; do
    echo "$line"
done < file.txt

# Efficient
while IFS= read -r line; do
    echo "$line"
done < file.txt

并行处理

对于可以并发执行的任务,请考虑使用并行处理来加速脚本。xargs和等工具GNU parallel非常有用。

# Using xargs for parallel processing
cat urls.txt | xargs -n 1 -P 4 curl -O

错误处理

强大的错误处理对于创建可靠且可维护的脚本至关重要。以下是一些增强 Bash 脚本错误处理的技术。

出错时退出

使用set -e可确保任何命令失败时脚本立即退出,从而防止级联错误。

set -e

自定义错误消息

实现自定义错误消息,以便在出现问题时提供更多背景信息。

command1 || { echo "command1 failed"; exit 1; }

陷阱信号

使用trap命令来优雅地捕获和处理信号和错误。

trap 'echo "Error occurred"; cleanup; exit 1' ERR

function cleanup() {
    # Cleanup code
}

验证输入

始终验证用户输入和脚本参数以防止意外行为。

if [[ -z "$1" ]]; then
    echo "Usage: $0 <argument>"
    exit 1
fi

日志记录

实施日志记录以跟踪脚本执行并诊断问题。

logfile="script.log"
exec > >(tee -i $logfile)
exec 2>&1

echo "Script started"

自动执行复杂的系统管理任务

高级 shell 脚本可以大大简化复杂的系统管理任务。下面是几个示例。

自动备份

创建自动备份脚本可确保定期保存关键数据并在发生故障时恢复。

#!/bin/bash

set -e
trap 'echo "Backup failed"; exit 1' ERR

backup_dir="/backup"
timestamp=$(date +%Y%m%d%H%M%S)
backup_file="${backup_dir}/backup_${timestamp}.tar.gz"

# Create a backup
tar -czf "$backup_file" /important_data

echo "Backup completed: $backup_file"

系统监控

自动化系统监控以主动检测和应对问题。

#!/bin/bash

threshold=80
partition="/dev/sda1"

usage=$(df -h | grep "$partition" | awk '{print $5}' | sed 's/%//')

if [[ "$usage" -gt "$threshold" ]]; then
    echo "Disk usage on $partition is above $threshold%"
    # Add code to handle high disk usage
fi

用户管理

简化用户管理任务,例如添加或删除用户。

#!/bin/bash

function add_user() {
    local username=$1
    useradd "$username" && echo "User $username added successfully"
}

function remove_user() {
    local username=$1
    userdel "$username" && echo "User $username removed successfully"
}

case $1 in
    add)
        add_user "$2"
        ;;
    remove)
        remove_user "$2"
        ;;
    *)
        echo "Usage: $0 {add|remove} <username>"
        exit 1
        ;;
esac

自动更新

确保您的系统始终通过自动更新脚本保持最新。

#!/bin/bash

set -e
trap 'echo "Update failed"; exit 1' ERR

apt-get update && apt-get upgrade -y

echo "System updated successfully"

网络配置

自动化网络配置任务以快速设置新系统。

#!/bin/bash

function configure_network() {
    local interface=$1
    local ip_address=$2
    local gateway=$3

    cat <<EOF > /etc/network/interfaces
auto $interface
iface $interface inet static
    address $ip_address
    gateway $gateway
EOF

    systemctl restart networking
    echo "Network configured on $interface"
}

configure_network "eth0" "192.168.1.100" "192.168.1.1"

https://tldp.org/LDP/abs/html/
https://www.gnu.org/software/bash/manual/bash.html
https://www.amazon.com/Linux-Command-Scripting-Bible-Third/dp/111898384X/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值