Shebang行

#!/

Shebang行指定脚本使用的解释器,必须是脚本的第一行。

#!/bin/bash
#!/usr/bin/env bash
提示: 使用#!/usr/bin/env bash可以提高脚本的可移植性,因为它会在环境变量PATH中查找bash。

注释

注释用于解释代码,不会被Shell执行。单行注释以#开头。

# 这是一个单行注释

: << 'COMMENT'
这是多行注释
可以跨越多行
COMMENT

变量

变量用于存储数据。变量名区分大小写,赋值时等号两边不能有空格。

name="Linux用户" # 定义变量
echo "Hello, $name" # 使用变量

# 只读变量
readonly PI=3.14

# 删除变量
unset name

参数传递

脚本可以接收命令行参数,通过$0, $1, $2...访问。

# 执行脚本: ./script.sh arg1 arg2
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数: $@"

数组

数组用于存储多个值,可以通过索引访问。

# 定义数组
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

条件判断

使用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

循环

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

函数

函数用于封装可重用的代码块,可以接收参数和返回值。

# 定义函数
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

调试

Shell脚本提供多种调试选项,帮助查找和修复错误。

#!/bin/bash
# 启用调试模式
set -x # 显示执行的命令和参数

name="Shell"
echo "Hello, $name"

set +x # 关闭调试模式

# 其他调试选项
set -e # 遇到错误立即退出
set -u # 遇到未定义变量报错
set -o pipefail # 管道中任意命令失败则整个管道失败