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