【问题标题】:Bash-script File creation and fillBash-script 文件创建和填充
【发布时间】:2025-12-01 12:15:01
【问题描述】:

我正在尝试编写一个 bash 脚本,它将创建一定数量的文件,这些文件将传递给一个参数,并用相关信息填充该文件。然而,由于某种原因,我无法让它正常工作,谷歌搜索也没有任何结果。

我希望它创建如下文件: 文件名:

Prob_3_ch_17.cpp

填写如下:

/*
User: Johnny Smith
Prob: 3
Output: 
*/

第一个命令行参数是章节号。第二个是起始编号,第三个是结束编号。因此,如果运行以下内容

sh ../FileMaker.sh 17 1 10

它将为第 17 章创建 10 个文件,每个文件都包含适当的数据和适当的文件名。这是我想出的脚本。

#!/bin/bash

# Syntax:
# $1 = Chapter Number
# $2 = Starting Number
# $3 = Ending Number

CHAPTER=$1
FIRST=$2
LAST=$3
U_NAME="Johnny Smith"

# Name: Prob_$NUMBER_Ch_$1.cpp

for ((NUMBER=$FIRST; $NUMBER<=$LAST; $NUMBER++));
   do
      if [ -e "Prob_$NUMBER_Ch_$CHAPTER.cpp" ]; then
         echo "File Prob_$NUMBER_Ch_$CHAPTER.cpp already exists!"
      else
         echo "/* \n User: $U_NAME \n Problem: $NUMBER \n Output: \n */" >> "Prob_$NUMBER_Ch_$CHAPTER.cpp"
   done

但是,它没有运行。我收到以下错误:

../FileMaker.sh: line 21: syntax error near unexpected token `done'
../FileMaker.sh: line 21: `done'

我用谷歌搜索过,发现其他人也有同样的问题,但我不完全理解解决方案的含义。有人可以帮帮我吗?我不是最擅长编写 shell 脚本,我正在尝试通过编写这样的脚本来学习。

提前致谢。

【问题讨论】:

  • 您可能想尝试简化脚本,或者提出更有针对性的问题,或者解决问题。

标签: bash file loops creation


【解决方案1】:

if 块和 for 循环的语法错误。正确的语法是 -

    for ((NUMBER=FIRST; NUMBER<=LAST; NUMBER++));
   do
      if [ -e "Prob_$NUMBER_Ch_$CHAPTER.cpp" ]; then
         echo "File Prob_$NUMBER_Ch_$CHAPTER.cpp already exists!"
      else
         echo "/* \n User: $U_NAME \n Problem: $NUMBER \n Output: \n */" >> "Prob_$NUMBER_Ch_$CHAPTER.cpp"
      fi
   done

请参阅example 11.12 了解 c 风格的 for 循环。

要创建文件,请在所有位置使用 "Prob_"$NUMBER"Ch"$CHAPTER".cpp"。

【讨论】:

  • 谢谢先生。我会赞成你的回答,但它不会让我,因为我没有 15 声望。
【解决方案2】:

大多数 shell 允许在顶部使用 set -x。这显示了脚本在执行时的跟踪。

  1. 您需要一个尾随 fi 来关闭 if 语句。
  2. Shell 数学需要NUMBER=$(expr $NUMBER + 1),它不懂$NUMBER++
  3. 您可能会发现printf 命令比echo 更方便。

您仍然会在循环中使用错误的变量,并且只创建一个文件。我希望你能弄清楚这一点,因为这似乎是家庭作业。

【讨论】:

  • 我这样做了,但现在出现以下错误。 ../FileMaker.sh: line 15: ((: NUMBER=: syntax error: operand expected (error token is "=")