Shebang行
#!/
Shebang行指定脚本使用的解释器,必须是脚本的第一行。
#!/bin/bash
#!/usr/bin/env bash
#!/usr/bin/env bash
提示: 使用
#!/usr/bin/env bash可以提高脚本的可移植性,因为它会在环境变量PATH中查找bash。
注释
注释用于解释代码,不会被Shell执行。单行注释以#开头。
# 这是一个单行注释
: << 'COMMENT'
这是多行注释
可以跨越多行
COMMENT
: << 'COMMENT'
这是多行注释
可以跨越多行
COMMENT
变量
变量用于存储数据。变量名区分大小写,赋值时等号两边不能有空格。
name="Linux用户" # 定义变量
echo "Hello, $name" # 使用变量
# 只读变量
readonly PI=3.14
# 删除变量
unset name
echo "Hello, $name" # 使用变量
# 只读变量
readonly PI=3.14
# 删除变量
unset name
参数传递
脚本可以接收命令行参数,通过$0, $1, $2...访问。
# 执行脚本: ./script.sh arg1 arg2
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数: $@"
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数: $@"
数组
数组用于存储多个值,可以通过索引访问。
# 定义数组
fruits=("apple" "banana" "cherry")
# 访问数组元素
echo "第一个水果: ${fruits[0]}"
# 获取所有元素
echo "所有水果: ${fruits[@]}"
# 数组长度
echo "水果数量: ${#fruits[@]}"
fruits=("apple" "banana" "cherry")
# 访问数组元素
echo "第一个水果: ${fruits[0]}"
# 获取所有元素
echo "所有水果: ${fruits[@]}"
# 数组长度
echo "水果数量: ${#fruits[@]}"
运算符
Shell支持算术、关系、布尔和字符串运算符。
# 算术运算
sum=$((10 + 5))
echo "10 + 5 = $sum"
# 关系运算符(在条件判断中使用)
if [ 10 -gt 5 ]; then
echo "10大于5"
fi
# 字符串运算符
str1="hello"
str2="world"
if [ "$str1" != "$str2" ]; then
echo "字符串不相等"
fi
sum=$((10 + 5))
echo "10 + 5 = $sum"
# 关系运算符(在条件判断中使用)
if [ 10 -gt 5 ]; then
echo "10大于5"
fi
# 字符串运算符
str1="hello"
str2="world"
if [ "$str1" != "$str2" ]; then
echo "字符串不相等"
fi
条件判断
使用if、elif、else语句根据条件执行不同的代码块。
num=10
if [ $num -gt 15 ]; then
echo "数字大于15"
elif [ $num -gt 5 ]; then
echo "数字在6到15之间"
else
echo "数字小于等于5"
fi
# case语句
case $num in
10) echo "数字是10" ;;
20) echo "数字是20" ;;
*) echo "其他数字" ;;
esac
if [ $num -gt 15 ]; then
echo "数字大于15"
elif [ $num -gt 5 ]; then
echo "数字在6到15之间"
else
echo "数字小于等于5"
fi
# case语句
case $num in
10) echo "数字是10" ;;
20) echo "数字是20" ;;
*) echo "其他数字" ;;
esac
循环
Shell支持for、while和until循环,用于重复执行代码块。
# for循环
for i in 1 2 3 4 5
do
echo "数字: $i"
done
# while循环
count=1
while [ $count -le 5 ]
do
echo "计数: $count"
count=$((count + 1))
done
# until循环
count=1
until [ $count -gt 5 ]
do
echo "直到计数: $count"
count=$((count + 1))
done
for i in 1 2 3 4 5
do
echo "数字: $i"
done
# while循环
count=1
while [ $count -le 5 ]
do
echo "计数: $count"
count=$((count + 1))
done
# until循环
count=1
until [ $count -gt 5 ]
do
echo "直到计数: $count"
count=$((count + 1))
done
函数
函数用于封装可重用的代码块,可以接收参数和返回值。
# 定义函数
greet() {
echo "Hello, $1!"
}
# 调用函数
greet "World"
# 函数返回值
add() {
return $(($1 + $2))
}
add 10 20
result=$?
echo "结果: $result"
greet() {
echo "Hello, $1!"
}
# 调用函数
greet "World"
# 函数返回值
add() {
return $(($1 + $2))
}
add 10 20
result=$?
echo "结果: $result"
输入输出
Shell脚本可以通过标准输入读取数据,并通过标准输出和错误输出显示结果。
# 读取用户输入
echo -n "请输入您的名字: "
read name
echo "您好, $name!"
# 输出重定向
echo "输出到文件" > output.txt
echo "追加到文件" >> output.txt
# 输入重定向
wc -l < output.txt
# 错误输出重定向
command_not_found 2> error.log
echo -n "请输入您的名字: "
read name
echo "您好, $name!"
# 输出重定向
echo "输出到文件" > output.txt
echo "追加到文件" >> output.txt
# 输入重定向
wc -l < output.txt
# 错误输出重定向
command_not_found 2> error.log
调试
Shell脚本提供多种调试选项,帮助查找和修复错误。
#!/bin/bash
# 启用调试模式
set -x # 显示执行的命令和参数
name="Shell"
echo "Hello, $name"
set +x # 关闭调试模式
# 其他调试选项
set -e # 遇到错误立即退出
set -u # 遇到未定义变量报错
set -o pipefail # 管道中任意命令失败则整个管道失败
# 启用调试模式
set -x # 显示执行的命令和参数
name="Shell"
echo "Hello, $name"
set +x # 关闭调试模式
# 其他调试选项
set -e # 遇到错误立即退出
set -u # 遇到未定义变量报错
set -o pipefail # 管道中任意命令失败则整个管道失败