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
相关推荐
苏生Susheng3 分钟前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
额额额对了5 分钟前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议
zx_7414848138 分钟前
【Linux入门】Linux 安装:VMware Workstation Pro 安装 CentOS 7 保姆级图文教程
linux·centos
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
智购科技无人售货机厂家1 小时前
2026自动售货机备用电池管理系统设计:从充放电保护到健康监测的工程实践~YH
大数据·linux·单片机·嵌入式硬件·微信
小雪崩1 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
spencer_tseng2 小时前
[j2cache ehcache.xml]/tmp/.ehcache-diskstore.lock (Permission denied)
xml·linux·python·ehcache·[j2cache
Wendy不吃榴莲2 小时前
# AI短剧教程 - 《后西游记》开播后,AI影视为什么更考验“连续讲故事”?
人工智能·笔记·学习·ai·视频
Agudamu11612 小时前
B站学习视频怎么变笔记:用 Ai好记 + Obsidian 搭建个人知识库的完整教程
人工智能·笔记·学习·音视频
内核笔记2 小时前
休眠唤醒 standby 调试
linux·bsp