【问题标题】:how to work at the same time with multiple files inside file name array in linux shell script?如何在linux shell脚本中的文件名数组中同时处理多个文件?
【发布时间】:2013-12-07 07:10:26
【问题描述】:

我有一个 shell 脚本,我首先读取指定文件夹中的所有 .s 文件,然后使用循环将它们编译为目标文件,然后将它们链接到可执行文件。 这个:

FILES=PTscalar_1.0/mibenchforpt/security/sha/*.s

for sfile in $FILES 
do

echo "------------------------------------------------"
    echo $sfile
    objectFile="${sfile%.s}.o"
    exefile="${objectFile%.o}.ex"

    simplescalar/bin/sslittle-na-sstrix-as -o  $objectFile $sfile

done

但我有一个问题:在 sha mibench 程序中,我们有 2 个文件,每个文件都在这个流程中:

.c -> .s -> .o

但在最后阶段,应将两个 .o 文件链接到一个可执行文件中。

如何同时获取两个文件名并创建一个命令来链接它们。

主要代码是这样的:

simplescalar/bin/sslittle-na-sstrix-ld -o __sha.ex _sha.o _sha_driver.o

有没有办法像这样查看文件的内部:

OFILES=PTscalar_1.0/mibenchforpt/security/sha/*.o
simplescalar/bin/sslittle-na-sstrix-ld -o $exefile OFILES[0] OFILES[1]

然后在循环中对具有此模式的所有文件执行此操作 第一个文件就像*.o*_main.o 第二个是:*_driver.o

谢谢

【问题讨论】:

  • 你怎么不使用makefile呢?
  • "shell" 太通用了——并不是所有的 shell 都支持数组。如果需要数组支持,则需要使用具有正确扩展名的特定 shell,例如 bash。
  • 在 shell 中使用大写变量名对于既不是 (1) 环境变量,也不是 (2) 有意引用 shell 内置函数的事物来说是不好的做法。在您的 shell 实例本地的每个变量中至少使用一个小写字符可以防止命名空间冲突,否则被认为是一种好的做法。

标签: shell filenames sha


【解决方案1】:

我创建了这个文件并且它有效:

#!/bin/bash
#compile to assembly:

FILES=*_driver.s

for sdriverfile in $FILES 
do

echo "------------------------------------------------"
# s file
    echo $sdriverfile
    sfile="${sdriverfile%_driver.s}.s"
    echo $sfile

# object files
    obj="${sfile%.s}.o"
    obj_driver="${sdriverfile%.s}.o"

#exe file
    exefile="${sfile%.s}_as.ex"
    echo $exefile

#compile
    /home/mahdi/programs/simplescalar/bin/sslittle-na-sstrix-as -o  $obj $sfile
    /home/mahdi/programs/simplescalar/bin/sslittle-na-sstrix-as -o  $obj_driver $sdriverfile

#link
    /home/mahdi/programs/simplescalar/bin/sslittle-na-sstrix-ld -o $exefile $obj $obj_driver -L /home/mahdi/programs/simplescalar/sslittle-na-sstrix/lib -lc -L /home/mahdi/programs/simplescalar/lib/gcc-lib/sslittle-na-sstrix/2.7.2.3/ -lgcc



done

感谢您的回答。

【讨论】:

    【解决方案2】:

    警告:您的标签“linuxshell”没有指定特定的外壳。 POSIX sh,为/bin/sh 指定最低要求行为的标准,不支持数组;您应该使用特定的 shell,例如 bash 或 ksh。为此,您需要使用适当的 shebang(例如 #!/bin/bash 而不是 #!/bin/sh)开始您的脚本,并使用正确的 shell 进行任何手动调用(如果您要使用 bash -x myscript,则应使用 bash -x myscript。 .. 虽然如果你正确设置了 shebang 并且拥有+x 权限,你总是可以只使用./myscript)


    # this is broken
    FILES=PTscalar_1.0/mibenchforpt/security/sha/*.s
    

    ...不创建数组。

    # this works in bash, ksh, and zsh
    files=( PTscalar_1.0/mibenchforpt/security/sha/*.s )
    

    确实创建了一个数组,可以将其扩展为"${files[@]}"。所以:

    # this works in bash and ksh, and probably zsh
    for file in "${files[@]}"; do
      ...
    done
    

    但是,在这种特殊情况下,您根本没有理由使用数组:

    # this works with absolutely any POSIX-compatible shell
    for file in PTscalar_1.0/mibenchforpt/security/sha/*.s; do
      echo "$sfile"
      objectFile=${sfile%.s}.o
      exefile=${objectFile%.o}.ex
    
      simplescalar/bin/sslittle-na-sstrix-as -o "$objectFile" "$sfile"
    done
    

    请注意上面所做的一些更正:

    • 语法中没有文字空格的赋值的右侧不需要引用。
    • 所有扩展(如$objectFile确实都需要引用,所以,"$objectFile"
    • ...是的,这确实包括echo;要对此进行测试,请运行 s='*' 并将 echo $s 的输出与 echo "$s" 进行比较。

    解决您编辑的后续问题:

    ofiles=( PTscalar_1.0/mibenchforpt/security/sha/*.o )
    simplescalar/bin/sslittle-na-sstrix-ld -o "$exefile" "${ofiles[0]}" "${ofiles[1]}"
    

    ... 是字面上的答案,但如果您有两个或更多输出,则需要对其进行编辑。这样做会更好:

    ofiles=( PTscalar_1.0/mibenchforpt/security/sha/*.o )
    simplescalar/bin/sslittle-na-sstrix-ld -o "$exefile" "${ofiles[@]}"
    

    【讨论】:

    • POSIX sh 是否支持数组;每个子外壳都有一个。常用的运算符有set -- ...shift"$1""$2"...)、"$@"
    • @JoSo 这不是“数组”,而是一个数组。 (虽然如果你计算 argv,每个子 shell 不止一个,因为每个函数都有自己的)。
    • 是的 function 我的意思是,很抱歉造成混乱。我不知道“计数 argv”是什么意思——只有这种类型的数组。并且很难找到每个函数 1 个不够的情况。只要你用 shell 做它的用途,也就是连接程序。
    • @JoSo 如果您超越纯 POSIX sh(例如:ksh、bash 和 zsh 数组是稀疏的,而 argv 可以),那么“只有一种类型的数组”是完全不正确的不是)。不过,我不确定在这里争论这一点是否会有所进展。在 irc.freenode.org #bash 中以 nDuff 身份找到我?
    • 我想我已经明确表示我在谈论sh。感谢聊天邀请,我对 bash 不感兴趣。
    【解决方案3】:

    显然这在 shell 中是可能的。然而,许多人发现 make 实用程序比 shell 脚本更适合构建软件,这仅仅是因为这些依赖关系。看看GNU Make。它的文档包含许多您正在尝试做的事情的示例。

    【讨论】:

    • 我同意 make 是该用例的正确工具...但如果其他人在搜索过程中发现了这个问题,他们很可能有一个用例,其中 shell 数组确实是正确的工具(特别是它的主题行没有说明任何关于制作或编译的内容)。除了针对您的用例的最佳实践答案之外,获得字面答案会很有帮助。
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2011-04-25
    • 2013-05-02
    • 2014-09-26
    • 2015-05-15
    相关资源
    最近更新 更多