shell语言核心语法
我来为您详细介绍Shell的核心语法。
1. 变量操作
- 变量定义和赋值
# 基本赋值
name="张三"
age=25# 只读变量
readonly PI=3.14159# 删除变量
unset name# 变量引用
echo $name
echo ${name} # 推荐方式,可以避免歧义
- 特殊变量
$0 # 脚本名称
$1 # 第一个参数
$# # 参数个数
$* # 所有参数
$@ # 所有参数(推荐使用,可以正确处理参数中的空格)
$? # 上一个命令的退出状态
$$ # 当前进程ID
2. 字符串操作
- 字符串长度
str="Hello World"
echo ${#str} # 输出:11
- 字符串截取
str="Hello World"
echo ${str:0:5} # 输出:Hello
echo ${str:6:5} # 输出:World
- 字符串替换
str="hello hello hello"
echo ${str/hello/hi} # 替换第一个hello
echo ${str//hello/hi} # 替换所有hello
3. 数组操作
- 数组定义和访问
# 定义数组
fruits=("苹果" "香蕉" "橙子")# 访问元素
echo ${fruits[0]} # 输出:苹果
echo ${fruits[@]} # 输出所有元素
echo ${#fruits[@]} # 输出数组长度
- 数组操作
# 添加元素
fruits+=("葡萄")# 删除元素
unset fruits[1]# 遍历数组
for fruit in "${fruits[@]}"; doecho $fruit
done
4. 条件判断
- if语句
# 基本语法
if [ condition ]; thencommands
elif [ condition ]; thencommands
elsecommands
fi# 示例
if [ $age -gt 18 ]; thenecho "成年人"
elif [ $age -eq 18 ]; thenecho "刚成年"
elseecho "未成年人"
fi
- 条件测试
# 文件测试
[ -f file.txt ] # 文件是否存在
[ -d dir ] # 目录是否存在
[ -r file.txt ] # 文件是否可读
[ -w file.txt ] # 文件是否可写
[ -x file.txt ] # 文件是否可执行# 字符串比较
[ -z "$str" ] # 字符串是否为空
[ -n "$str" ] # 字符串是否非空
[ "$str1" = "$str2" ] # 字符串相等
[ "$str1" != "$str2" ] # 字符串不相等# 数值比较
[ $num1 -eq $num2 ] # 相等
[ $num1 -ne $num2 ] # 不相等
[ $num1 -gt $num2 ] # 大于
[ $num1 -lt $num2 ] # 小于
[ $num1 -ge $num2 ] # 大于等于
[ $num1 -le $num2 ] # 小于等于
5. 循环结构
- for循环
# 基本for循环
for i in {1..5}; doecho $i
done# C风格for循环
for ((i=1; i<=5; i++)); doecho $i
done# 遍历目录
for file in *.txt; doecho $file
done
- while循环
# 基本while循环
count=0
while [ $count -lt 5 ]; doecho $count((count++))
done# 读取文件
while read line; doecho $line
done < file.txt
- until循环
# 直到条件为真
count=0
until [ $count -eq 5 ]; doecho $count((count++))
done
6. 函数定义和使用
# 函数定义
function hello() {echo "Hello, $1!"return 0
}# 函数调用
hello "张三"# 获取返回值
hello "李四"
echo $? # 输出返回值
7. 命令替换和管道
- 命令替换
# 使用反引号
result=`ls -l`# 使用$()
result=$(ls -l)
- 管道操作
# 基本管道
ls | grep "test"# 组合多个命令
find . -name "*.txt" | xargs grep "hello"
8. 错误处理
# 设置错误时退出
set -e# 捕获错误
trap 'echo "错误发生"; exit 1' ERR# 自定义错误处理
function error_handler() {echo "错误发生在第 $1 行"exit 1
}
trap 'error_handler ${LINENO}' ERR
9. 调试技巧
# 开启调试模式
set -x# 显示执行的命令
set -v# 检查语法
bash -n script.sh# 调试特定行
bash -x script.sh
10. 实用技巧
- 参数解析
while [[ $# -gt 0 ]]; docase $1 in-e|--env)ENV="$2"shift 2;;-p|--port)PORT="$2"shift 2;;*)echo "未知参数: $1"exit 1;;esac
done
- 日志函数
function log() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}log "开始执行..."
log "执行完成"
这些是Shell脚本中最核心和常用的语法。掌握这些语法,您就能够编写出功能强大的Shell脚本。建议在实际应用中多加练习,逐步掌握这些语法特性。