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
相关推荐
لا معنى له3 小时前
目标检测的内涵、发展和经典模型--学习笔记
人工智能·笔记·深度学习·学习·目标检测·机器学习
石像鬼₧魂石5 小时前
内网渗透靶场实操清单(基于 Vulhub+Metasploitable 2)
linux·windows·学习·ubuntu
flying robot6 小时前
centos7系统配置
笔记
橘子真甜~6 小时前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
拾贰_C7 小时前
【Linux | Windows | Terminal Command】 Linux---grep | Windows--- findstr
linux·运维·服务器
阿华hhh8 小时前
Linux系统编程(标准io)
linux·开发语言·c++
石像鬼₧魂石8 小时前
Kali Linux 网络端口深度扫描
linux·运维·网络
alengan8 小时前
linux上面写python3日志服务器
linux·运维·服务器
zhdy567899 小时前
最简单方法 设置matlab坐标轴刻度标签的字号,设置坐标轴标题和图形标题,并指定字号。画出的图片背景设置为白色,
笔记
崇山峻岭之间9 小时前
Matlab学习笔记02
笔记·学习·matlab