Linux Shell 实验一:数据采集与脚本调试错误总结
一、实验简介
本次实验主要围绕 Linux 环境下的 Shell 脚本编写与数据采集操作,包括变量定义、循环控制、条件判断、目录操作、用户输入处理等内容。实验过程中出现了多种典型错误,本文将逐一分析并总结相关知识点。
二、错误与问题汇总
1. 变量赋值语法错误
a = "hello word"
错误信息:a:未找到命令
原因:Shell 中变量赋值不能有空格,应写为:
a="hello world"
2. 循环中变量递增语法错误
let"i=i+1"
错误信息:leti=i+1:未找到命令
正确写法:
let "i=i+1"
# 或
i=$((i + 1))
3. 目录创建权限不足
mkdir -m 754 /home/userdata
错误信息:权限不够
解决方法:使用 sudo
提权:
sudo mkdir -m 754 /home/userdata
4. 目录已存在导致重复创建
mkdir: 无法创建目录"/home/userdata/user1": 文件已存在
解决方法:在创建前判断目录是否存在:
if [ ! -d "$temp$i" ]; thenmkdir -m 754 "$temp$i"
fi
5. 算术运算符号错误
let "i=i+1"#
错误信息:无效的算术进制 (错误符号是 "1#")
原因:#
是注释符号,不能出现在 let
表达式中。
6. 条件判断中括号空格问题
while[ $num -gt 0 ]
错误信息:未找到命令
正确写法:
while [ $num -gt 0 ]
注意:[
是命令,后面必须有空格。
7. 表达式中的转义问题
myAnswer=$(expr $number1 \* $number2)
注意:*
在 Shell 中是通配符,需转义为 \*
。
8. 除零错误处理
if [ $number2 -eq 0 ]; thenecho "0 cannot be the divisor"continue
fi
说明:在除法运算前必须判断除数是否为0。
三、Shell 脚本知识点总结
1. 变量定义与使用
- 赋值:
变量名=值
(无空格) - 使用:
$变量名
2. 条件判断
- 格式:
[ 条件 ]
,注意括号与内容之间的空格 - 常用判断:
-eq
:等于-gt
:大于-d
:判断目录是否存在
3. 循环结构
for
循环:for((i=1; i<=8; i++))
while
循环:while [ 条件 ]; do... done
4. 用户输入
- 使用
read
命令读取用户输入:read num
5. 算术运算
- 使用
$((表达式))
或expr
命令:sum=$((num1 + num2)) result=$(expr $num1 + $num2)
6. 目录操作
- 创建目录:
mkdir
- 设置权限:
-m 754
- 判断目录是否存在:
[ -d 路径 ]
四、实验收获与建议
- 语法严谨性:Shell 对空格、符号非常敏感,需严格遵循语法规则。
- 错误处理:在脚本中应加入充分的错误判断,如目录是否存在、除数是否为0等。
- 调试技巧:可使用
set -x
开启调试模式,或逐行执行排查错误。
五、完整脚本示例
#!/bin/bash# 变量定义与使用
a="hello world"
echo $a# 循环与算术
num1=1
num2=1
sum=2
for((i=1; i<=8; i++))
dotmp=$((num1 + num2))echo -n "+$tmp"num1=$num2num2=$tmpsum=$((sum + tmp))
done
echo "=$sum"# 目录创建
sudo mkdir -m 754 /home/userdata
temp="/home/userdata/user"
for i in {1..5}; doif [ ! -d "$temp$i" ]; thenmkdir -m 754 "$temp$i"echo "创建目录:$temp$i"elseecho "目录已存在:$temp$i"fi
done# 简单计算器
while true; doecho "Input the first number (or 'q' to quit):"read number1if [ "$number1" = "q" ]; thenecho "Goodbye!"breakfiecho "Input the operator (+, -, *, /):"read opecho "Input the second number:"read number2case $op in+) result=$((number1 + number2)) ;;-) result=$((number1 - number2)) ;;\*) result=$((number1 * number2)) ;;/)if [ $number2 -eq 0 ]; thenecho "Error: Division by zero!"continueelseresult=$((number1 / number2))fi;;*)echo "Error: Invalid operator!"continue;;esacecho "Result: $number1 $op $number2 = $result"
done