shell编程入门指南从基础到实战

shell编程入门指南从基础到实战

什么是shell编程?

在开始我们的探索之前,我们需要先了解什么是shell编程。Shell是一种与操作系统交互的工具,它允许用户通过命令行界面(CLI)与计算机进行通信。Shell脚本则是在这些命令行界面中,使用一种特定的语法书写的一系列命令的集合,这些命令可以自动执行一系列复杂的任务。

为什么学习shell编程?

学习shell编程有很多好处,尤其对于那些想要提高工作效率、自动化任务或深入理解Unix/Linux系统的人来说。它提供了一个灵活且强大的方式来管理和维护你的系统配置,并且许多高级工程师和IT专业人士都认为掌握良好的shell技能是不可或缺的。

shell编程基础

变量定义和赋值

在任何一种编程语言中,变量都是存储数据的一个基本概念。在shell脚本中,你可以使用等号=来给变量赋值。你还可以使用方括号[]来引用字符串中的字符,并用花括号${}来访问变量。

# 定义并初始化一个变量

my_variable="Hello, World!"

# 使用方括号引用字符串中的字符

echo ${my_variable:0:5} # 输出 "Hello"

# 使用花括号访问变量

echo "${my_variable}" # 输出整个字符串 "Hello, World!"

条件语句

条件语句用于根据一定条件执行不同的代码块。在bash shell中,你可以使用if-then结构或者case-statement来实现这个功能。

#!/bin/bash

read -p "Enter your age: " age

if [ $age -ge 18 ]; then

echo "You are eligible to vote."

else

echo "You are not eligible to vote."

fi

# 使用case-statement选择不同分支处理逻辑:

read -p "Enter a number (1-3):" choice;

case "$choice" in

1) echo "Option one was chosen.";;

2) echo "Option two was chosen.";;

*) echo "Invalid option";;

esac;

循环控制结构

循环控制结构允许你重复执行某段代码多次,在bash shell中,你可以使用for-loops、while-loops或者until-loops进行循环操作:

#!/bin/bash

for i in {1..10}; do

if (( $i % 2 == 0 )); then

continue;

fi;

echo $i is an odd number.

done

num=1; while [ $num -le 5 ]; do printf "%d\n" "$num"; let num++ done

count=6; until [ $count > 10 ]; do printf "%d\n" "$count"; let count++ done

函数定义及调用函数

函数是一个可重用的代码块,可以被多次调用以完成特定任务。在bash shell 中,你可以通过声明一个名称并包含一组command后跟随do关键字,然后跟着结束符done创建函数:

#!/bin/bash

function greet {

local message=$1 # local作用域内有效。

echo Hello, $message!

}

greet John Doe

greet Jane Doe

实战案例:自动化文件备份任务

我们将构建一个简单的脚本,该脚本将会检查指定目录下的所有文件,如果它们比最后一次备份时间晚更改过,就会将它们备份到另一个位置。这不仅能帮助我们保持数据安全,还能节省大量手动操作时间。

首先,让我们创建一个名为backup.sh的新文件,并添加以下内容:

#!/bin/bash

BACKUP_DIR="/path/to/backup"

LAST_BACKUP_FILE="$BACKUP_DIR/.last_backup_time.txt"

function backup_files {

local dir=$1

find "$dir" \( ! -type d \) \

-exec stat --format="%Y:%f:%s:%n" '{}' \; | sort | tail +2 |

while read timestamp file_size file_name ; do

if [[ $(stat --format=%Y "$file_name") != "$timestamp ]]; then

cp --preserve=all "/$file_name" "/$BACKUP_DIR/$file_name.$(date +%F-%T)"

touch --reference="$file_name" "$LAST_BACKUP_FILE"

fi

done &> /dev/null

}

backup_files "/path/to/source_directory"

确保在上面的路径替换为实际存在于你的电脑上的路径。此外,请记得设置正确权限,以便运行此脚本。如果你想让这个脚本每天运行一次,那么你应该安排cron作业去触发它。你只需编辑crontab(通常输入 crontab -e),然后添加以下行:

0 * * * * bash /path/to/your/script/backup.sh > /dev/null &

这将使该script每天凌晨零点运行,从而保证你的重要文件得到最新备份。如果发生任何错误,它们也不会影响日常运作,因为输出已经被发送到了/dev/null。