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
相关推荐
ACP广源盛139246256732 小时前
硬件选型笔记:国产 PCIe Gen2.1 交换芯片 IX6024@ACP,工控与存量设备国产化改造方案评估
笔记·硬件架构·硬件工程·pcie·国产芯片
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
文人sec3 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
快乐的韭菜根根3 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
摇滚侠4 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
xier_ran4 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
志尊宝5 小时前
Vue3 零基础每日笔记(078):首屏加载速度优化汇总——清单化方案
笔记
倒头就睡的小比特5 小时前
Linux基础指令3
linux·服务器
梦帮科技5 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
半杯咖啡半行码6 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络