Linux Shell 实验一:数据采集与脚本调试错误总结

一、实验简介

本次实验主要围绕 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 循环:

    bash 复制代码
    for((i=1; i<=8; i++))
  • while 循环:

    bash 复制代码
    while [ 条件 ]; do
      ...
    done

4. 用户输入

  • 使用 read 命令读取用户输入:

    bash 复制代码
    read num

5. 算术运算

  • 使用 $((表达式)) 或 expr 命令:

    bash 复制代码
    sum=$((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
相关推荐
欢欢李8 小时前
【LTE L3 笔记 06】LTE下行参考信号
笔记·无线通信·物理层·lte·空口协议
前进的李工16 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
lzx_00218 小时前
Linux 进程(二) 深入理解进程
linux
蒸蒸yyyyzwd18 小时前
后端学习笔记三个知识
笔记·八股
沫璃染墨19 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
温暖小土19 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos
GeW21 小时前
国产化替代进入深水区之后Linux 与数据库为什么必须走向重建
linux
Zhao-Jichao21 小时前
AI Prompting for Everyone 课程笔记 - P19 数据分析 Data Analysis
人工智能·笔记·数据分析
旖旎夜光21 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
ACP广源盛1392462567321 小时前
选型笔记:Type‑C 扩展坞方案评估|DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP
笔记·硬件架构·硬件工程·视频·国产芯片