【问题标题】:creating file with dynamic names in for loop在 for 循环中创建具有动态名称的文件
【发布时间】:2022-12-12 09:44:28
【问题描述】:

我试图循环几个 linux 命令并将它们重定向到一个文件,我在根据命令名称分配文件名时遇到困难。我确定有更好的方法可以做到这一点,但现在这就是我的脚本

#!/bin/sh
j=0
fileName=ls
fileName1=date
echo $fileName$j
for item in "ls -l >> /home/Desktop/$fileName$j" "date >>/home/Desktop/$fileName$j";do
        eval $item
        j=$((j+1))
done

这些命令有效,但它不会创建文件名,因为我希望有 ls 文件和日期文件。考虑到我有 20 多个命令,在名称与其内容相关的文件中获取这些命令输出的最佳方法是什么。

我曾尝试使用 eval 来获得动态变量名,但没有成功。

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。由于这是一个学习网站,我想向您推荐以下网站:BashFAQ: never parse ls 和BashFAQ#048: eval is evil 和BashFAQ#050: how to build commands
  • 感谢@kvantour,我能够在 bash 中执行此操作,但在 sh 中特别需要它,无法在那里找到好的资源。此外,这里的命令只是示例,而不是我正在查看的确切命令。我的问题是文件名变量有动态命名,所以在循环中我可以使用它。

标签: sh


【解决方案1】:

假设您有一个命令列表,这些命令需要一组可能很复杂的特定参数(空格、换行符……):

cmd1 arg11 arg12 arg13
cmd2 arg21
cmd3 arg31 arg32
...
cmdn argn1 argn2 ... argnm

每个命令的输出都需要存储在cmd1.txt、cmd2.txt ... cmdn.txt中。

实现这一目标的一种方法是使用数组和间接寻址:

#!/usr/bin/env bash
# Define commands
cmd_1=( "cmd1" "arg11" "arg12" "arg13" )
cmd_2=( "cmd2" "arg21" )
cmd_3=( "cmd3" "arg31" "arg32" )
..
cmd_n=( "cmdn" "argn1" ... "argnm" )
# Define command list to use indirection
cmd_list=( cmd_1[@] cmd_2[@] ... cmd_n[@] )

# loop over commands
for _ref in "${cmd_list[@]}"; do
   # use indirection to get the full command
   _cmd=( "${!_ref}" )
   # execute the command and write to file 
   "${_cmd[@]}" > "${_cmd[0]}.txt"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 2023-03-11
    • 1970-01-01
    • 2014-02-10
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多