#!/bin/bash# shell-basic-structure.shecho"=== Shell脚本基础结构 ==="# 1. Shebang行(指定解释器)#!/bin/bash# 2. 注释说明# 脚本功能:演示Shell基础结构# 作者:Linux运维精灵# 创建时间:2024# 3. 变量定义SCRIPT_NAME="shell-basic-structure.sh"VERSION="1.0"AUTHOR="Linux运维精灵"# 4. 函数定义show_header() {echo"========================================"echo"脚本名称: $SCRIPT_NAME"echo"版本: $VERSION"echo"作者: $AUTHOR"echo"运行时间: $(date)"echo"========================================"}# 5. 主程序逻辑main() { show_header# 获取脚本参数local arg_count=$#echo"参数个数: $arg_count"# 显示所有参数if [ $arg_count -gt 0 ]; thenecho"参数列表: $@"for i in $(seq 1 $arg_count); doecho" 参数$i: ${!i}"donefi# 环境信息echo"当前用户: $(whoami)"echo"主机名: $(hostname)"echo"工作目录: $(pwd)"}# 6. 脚本执行入口if [ "${BASH_SOURCE[0]}" = "$0" ]; then main "$@"fi
#!/bin/bash# variables-and-data-types.shecho"=== Shell变量和数据类型 ==="# 1. 变量定义和使用name="Linux运维精灵"age=3score=98.5is_active=trueecho"字符串变量: $name"echo"整数变量: $age"echo"浮点数变量: $score"echo"布尔变量: $is_active"# 2. 只读变量readonly readonly_var="这是只读变量"echo"只读变量: $readonly_var"# 3. 局部变量(函数内)local_variable_example() {local local_var="函数内的局部变量"echo"局部变量: $local_var"}local_variable_example# 4. 环境变量export ENV_VAR="这是环境变量"echo"环境变量: $ENV_VAR"# 5. 特殊变量echo"脚本名称: $0"echo"参数个数: $#"echo"所有参数: $@"echo"第一个参数: $1"echo"进程ID: $$"echo"上条命令退出状态: $?"# 6. 数组变量fruits=("苹果""香蕉""橙子""葡萄")echo"数组元素: ${fruits[@]}"echo"数组长度: ${#fruits[@]}"echo"第一个水果: ${fruits[0]}"# 7. 关联数组(Bash 4.0+)declare -A user_infouser_info["name"]="张三"user_info["age"]="25"user_info["city"]="北京"echo"关联数组: ${user_info[@]}"echo"用户姓名: ${user_info["name"]}"# 8. 变量操作string="Hello World"echo"字符串长度: ${#string}"echo"子字符串: ${string:6:5}"echo"大写: ${string^^}"echo"小写: ${string,,}"
#!/bin/bash# operators-usage.shecho"=== Shell运算符使用 ==="# 1. 算术运算符a=10b=3echo"算术运算:"echo"a + b = $((a + b))"echo"a - b = $((a - b))"echo"a * b = $((a * b))"echo"a / b = $((a / b))"echo"a % b = $((a % b))"echo"a ** b = $((a ** b))"# 2. 关系运算符echo -e "\n关系运算:"if [ $a -eq $b ]; thenecho"a等于b"; elseecho"a不等于b"; fiif [ $a -ne $b ]; thenecho"a不等于b"; fiif [ $a -gt $b ]; thenecho"a大于b"; fiif [ $a -lt $b ]; thenecho"a小于b"; fiif [ $a -ge $b ]; thenecho"a大于等于b"; fiif [ $a -le $b ]; thenecho"a小于等于b"; fi# 3. 逻辑运算符x=truey=falseecho -e "\n逻辑运算:"if [ "$x" = true ] && [ "$y" = false ]; thenecho"与运算: true"; fiif [ "$x" = true ] || [ "$y" = true ]; thenecho"或运算: true"; fiif ! [ "$y" = true ]; thenecho"非运算: true"; fi# 4. 字符串运算符str1="hello"str2="world"str3=""echo -e "\n字符串运算:"if [ -z "$str3" ]; thenecho"str3为空"; fiif [ -n "$str1" ]; thenecho"str1非空"; fiif [ "$str1" = "hello" ]; thenecho"str1等于hello"; fiif [ "$str1" != "world" ]; thenecho"str1不等于world"; fi# 5. 文件测试运算符file="./test.txt"touch "$file"echo -e "\n文件测试:"if [ -e "$file" ]; thenecho"文件存在"; fiif [ -f "$file" ]; thenecho"是普通文件"; fiif [ -r "$file" ]; thenecho"文件可读"; fiif [ -w "$file" ]; thenecho"文件可写"; fiif [ -x "$file" ]; thenecho"文件可执行"; fiif [ -s "$file" ]; thenecho"文件大小>0"; firm "$file"# 6. 位运算符echo -e "\n位运算:"echo"按位与: $((a & b))"echo"按位或: $((a | b))"echo"按位异或: $((a ^ b))"echo"按位取反: $((~a))"echo"左移: $((a << 1))"echo"右移: $((a >> 1))"# 7. 赋值运算符c=10echo -e "\n赋值运算:"((c += 5)); echo"c += 5: $c"((c -= 3)); echo"c -= 3: $c"((c *= 2)); echo"c *= 2: $c"((c /= 4)); echo"c /= 4: $c"((c %= 3)); echo"c %= 3: $c"
#!/bin/bash# conditional-statements.shecho"=== Shell条件判断 ==="# 1. if-else 语句check_number() {local num=$1if [ $num -gt 100 ]; thenecho"$num 大于100"elif [ $num -gt 50 ]; thenecho"$num 大于50且小于等于100"elif [ $num -gt 0 ]; thenecho"$num 大于0且小于等于50"elseecho"$num 小于等于0"fi}echo"数字检查:"check_number 150check_number 75check_number 25check_number -10# 2. case 语句check_os() {local os_type=$1case$os_typein"linux")echo"这是Linux系统" ;;"windows")echo"这是Windows系统" ;;"macos")echo"这是macOS系统" ;; *)echo"未知操作系统: $os_type" ;;esac}echo -e "\n操作系统检查:"check_os "linux"check_os "windows"check_os "macos"check_os "android"# 3. 文件类型判断check_file_type() {local file_path=$1if [ -f "$file_path" ]; thenecho"$file_path 是普通文件"elif [ -d "$file_path" ]; thenecho"$file_path 是目录"elif [ -L "$file_path" ]; thenecho"$file_path 是符号链接"elif [ -b "$file_path" ]; thenecho"$file_path 是块设备"elif [ -c "$file_path" ]; thenecho"$file_path 是字符设备"elseecho"$file_path 不存在或类型未知"fi}echo -e "\n文件类型检查:"check_file_type "/etc/passwd"check_file_type "/tmp"check_file_type "/dev/null"# 4. 字符串模式匹配check_filename() {local filename=$1case$filenamein *.txt)echo"文本文件: $filename" ;; *.sh)echo"Shell脚本: $filename" ;; *.tar.gz|*.tgz)echo"压缩包: $filename" ;; *)echo"其他文件: $filename" ;;esac}echo -e "\n文件名检查:"check_filename "document.txt"check_filename "script.sh"check_filename "backup.tar.gz"check_filename "image.png"# 5. 复杂的条件组合advanced_check() {local file=$1local min_size=$2if [ -f "$file" ] && [ -s "$file" ] && [ $(stat -c%s "$file") -gt $min_size ]; thenecho"文件存在、非空且大于${min_size}字节"return 0elseecho"检查未通过"return 1fi}echo -e "\n高级文件检查:"advanced_check "/etc/passwd" 1000
#!/bin/bash# loop-control.shecho"=== Shell循环控制 ==="# 1. for 循环echo"1. for循环示例:"# 数字范围循环echo"数字循环:"for i in {1..5}; doecho" 数字: $i"done# 数组循环fruits=("苹果""香蕉""橙子""葡萄")echo"数组循环:"for fruit in"${fruits[@]}"; doecho" 水果: $fruit"done# 文件循环echo"文件循环:"for file in /etc/*.conf; doif [ -f "$file" ]; thenecho" 配置文件: $(basename "$file")"fidone# C风格for循环echo"C风格循环:"for ((i=0; i<5; i++)); doecho" 计数: $i"done# 2. while 循环echo -e "\n2. while循环示例:"# 条件循环counter=1echo"条件循环:"while [ $counter -le 5 ]; doecho" 计数: $counter" ((counter++))done# 读取文件行echo"读取文件行:"while IFS= read -r line; doecho" 行内容: $line"done < /etc/passwd# 无限循环(带退出条件)echo"无限循环(按Ctrl+C退出):"whiletrue; doecho" 当前时间: $(date)" sleep 1done &# 3. until 循环echo -e "\n3. until循环示例:"count=1echo"until循环:"until [ $count -gt 5 ]; doecho" 计数: $count" ((count++))done# 4. 循环控制语句echo -e "\n4. 循环控制语句:"# break 示例echo"break示例:"for i in {1..10}; doif [ $i -eq 6 ]; thenecho" 遇到6,跳出循环"breakfiecho" 当前值: $i"done# continue 示例echo"continue示例:"for i in {1..5}; doif [ $i -eq 3 ]; thenecho" 跳过3"continuefiecho" 当前值: $i"done# 5. 嵌套循环echo -e "\n5. 嵌套循环示例:"echo"乘法表:"for i in {1..3}; dofor j in {1..3}; do result=$((i * j))echo -n " $i×$j=$result"doneechodone# 6. 选择循环echo -e "\n6. select循环(菜单示例):"PS3="请选择操作 (1-4): "options=("查看系统信息""查看磁盘使用""查看内存使用""退出")select opt in"${options[@]}"; docase$REPLYin 1)echo"系统信息:" uname -a ;; 2)echo"磁盘使用:" df -h ;; 3)echo"内存使用:" free -h ;; 4)echo"退出程序"break ;; *)echo"无效选项" ;;esacdone
#!/bin/bash# function-programming.shecho"=== Shell函数编程 ==="# 1. 基本函数定义和调用say_hello() {echo"Hello, $1!"}echo"1. 基本函数调用:"say_hello "World"say_hello "Linux"# 2. 函数参数calculate_sum() {local sum=0for num in"$@"; do ((sum += num))doneecho$sum}echo -e "\n2. 函数参数处理:"result=$(calculate_sum 1 2 3 4 5)echo"1+2+3+4+5 = $result"# 3. 函数返回值is_even() {local num=$1if [ $((num % 2)) -eq 0 ]; thenreturn 0 # 偶数,返回成功elsereturn 1 # 奇数,返回失败fi}echo -e "\n3. 函数返回值:"if is_even 10; thenecho"10是偶数"elseecho"10是奇数"fiif is_even 7; thenecho"7是偶数"elseecho"7是奇数"fi# 4. 局部变量variable_scope() {local local_var="局部变量" global_var="全局变量"echo"函数内: local_var=$local_var, global_var=$global_var"}echo -e "\n4. 变量作用域:"global_var="初始值"echo"函数前: global_var=$global_var"variable_scopeecho"函数后: global_var=$global_var"# echo "函数后: local_var=$local_var" # 这会报错# 5. 递归函数factorial() {local n=$1if [ $n -le 1 ]; thenecho 1elselocal prev=$(factorial $((n-1)))echo $((n * prev))fi}echo -e "\n5. 递归函数:"echo"5! = $(factorial 5)"echo"10! = $(factorial 10)"# 6. 函数库示例# 模拟一个数学函数库math_lib() {case$1in"add")echo $(($2 + $3)) ;;"sub")echo $(($2 - $3)) ;;"mul")echo $(($2 * $3)) ;;"div")if [ $3 -ne 0 ]; thenecho $(($2 / $3))elseecho"错误: 除数不能为0"return 1fi ;; *)echo"未知操作: $1"return 1 ;;esac}echo -e "\n6. 函数库使用:"echo"10 + 20 = $(math_lib add 10 20)"echo"50 - 30 = $(math_lib sub 50 30)"echo"6 * 7 = $(math_lib mul 6 7)"echo"100 / 5 = $(math_lib div 100 5)"# 7. 匿名函数(使用子shell)echo -e "\n7. 匿名函数(子shell):"result=$(local x=5local y=3echo $((x * y)))echo"5 * 3 = $result"# 8. 函数作为参数apply_function() {local func=$1local value=$2$func"$value"}double() {echo $(($1 * 2))}square() {echo $(($1 * $1))}echo -e "\n8. 函数作为参数:"echo"double(5) = $(apply_function double 5)"echo"square(4) = $(apply_function square 4)"# 9. 错误处理函数error_handler() {echo"错误发生在: ${BASH_SOURCE[1]}:${BASH_LINENO[0]}"echo"错误信息: $1"exit 1}safe_division() {if [ $2 -eq 0 ]; then error_handler "除数不能