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
相关推荐
x_lrong4 分钟前
Linux虚拟机配置jupyter环境并在宿主机访问
linux·运维·笔记·jupyter·虚拟机
蒙奇D索大10 分钟前
【11408学习记录】考研数学核心考点精讲:二维随机变量(离散与连续)全面解析
笔记·学习·考研·概率论·改行学it
羚羊角uou10 分钟前
【Linux网络】Socket编程TCP-实现Echo Server(上)
linux·运维·服务器
爱奥尼欧20 分钟前
【Linux笔记】网络部分——数据链路层mac-arp
linux·网络·笔记
Evan_ZGYF丶26 分钟前
深入解析CFS虚拟运行时间:Linux公平调度的核心引擎
linux·驱动开发·嵌入式·bsp
CHN悠远31 分钟前
debian13 安装钉钉后,钉钉无法运行问题的解决办法
linux·运维·服务器·钉钉·debian13
祎直向前32 分钟前
在Ubuntu中下载gcc
linux·运维·ubuntu
guygg8834 分钟前
Rocky Linux 8.9配置Kubernetes集群详解,适用于CentOS环境
linux·kubernetes·centos
liu****40 分钟前
11.Linux进程信号(三)
linux·运维·服务器·数据结构·1024程序员节
清风wxy42 分钟前
Duilib_CEF桌面软件实战之Duilib编译与第一个界面程序
c++·笔记·ui·mfc