【问题标题】:Create files inside folders with nested loops and arrays使用嵌套循环和数组在文件夹内创建文件
【发布时间】:2019-03-27 04:33:33
【问题描述】:

我正在尝试在其中创建 2 个文件夹和一些文件。但它不能创建超过第一个文件夹和第一个文件。代码说它无法创建第一个文件夹,因为它存在。甚至不要尝试创建其余的文件和文件夹。

这是我尝试过的

    #!/bin/bash                                                                                                                                                                                                 

    declare -a arrRel=(rel20 rel21)
    declare -a arrVar=(pt_el pt_mu)
    declare -a arrVarTitle=("electron p_T" "muon p_T")

for i in "${arrRel[@]}"
do
    mkdir "${arrRel[$i]}"
    cd "${arrRel[$i]}"

    for j in "${arrVar[$j]}"
    do
        textFile=text_${arrRel[$i]}_${arrVar[$j]}.txt
        targetDir=Desktop/samples                                                                                                                     

        cat >${textFile} <<EOF
        "some tex"    
EOF                                                                                                                                                                                                         

    done #arrVar                                                                                                                                                                                            

    cd ../ #cd arrRel                                                                                                                                                                                       

done #for loop over releases    

总结一下,应该有两个文件夹,rel20 和 rel21,两个文件夹里面都有两个文本文件。但我只得到文件夹 rel20 和其中只有一个文本文件。

如果你能指出为什么这不起作用,我将不胜感激。

【问题讨论】:

  • 在循环的第一次迭代中,i = rel20${arrRel[rel20]} 是什么?
  • 我建议不要在脚本中像这样使用cd;某些错误(执行或逻辑)太容易抛出cd 序列,并且您最终会在意外位置创建文件。而不是cd somedir 后跟cat &gt;somefile,而是使用cat &gt;somedir/somefile

标签: arrays bash loops nested


【解决方案1】:

我认为从你发布的内容来看,他就是你要找的。​​p>

#!/bin/bash

declare -a arrRel=(rel20 rel21)
declare -a arrVar=(pt_el pt_mu)
declare -a arrVarTitle=("electron p_T" "muon p_T")

for i in "${arrRel[@]}"
do
    mkdir "$i"
    cd "$i"

    for j in "${arrVar[@]}"
    do
        textFile=text_$i_$j.txt
        targetDir=Desktop/samples                                            

        cat >${textFile} <<EOF
        "some tex"
EOF

    done #arrVar

    cd ../ #cd arrRel

done

不确定您对 arrVarTitle 的意图是什么。

【讨论】:

  • 非常感谢您的帮助。我打算在文本文件中使用第三个数组。如果是pt_el的文本文件,则文本中应包含“electron p_T”。
  • 现在也可以创建第二个文件夹了,两者只有一个文本文件,即pt_el。它不会产生 pt_mu。
  • 你的意思是“电子 p_T”在数组 decleration 中?
  • 这很奇怪,当我运行它时它会创建两个文件。
  • 我暂时忽略它,但我仍然只有第一个文本 tfile
【解决方案2】:

您对数组的索引不正确。坦率地说,这些数组没有增加任何价值,也不值得混淆。做吧:

#!/bin/bash                                                                                                                                                                                                 

for i in rel20 rel21; do
    (   # This open paren is important
        mkdir -p $i
        cd $i

        for j in pt_el pt_mu; do
            textFile=text_$i_$j.txt
            targetDir=Desktop/samples                                                                                                                     

            cat >${textFile} <<-EOF
            "some tex"    
            EOF                                                                                                                                                                                                         

        done                                                                                                                                                                                           
    ) # end subshell to recover previous working directory
done

【讨论】:

  • 我明白了。非常感谢您。但是在每个文本文件中,我也想使用第三个数组。例如,在第二个文本文件中,我想插入第三个数组的第二个元素,而在第一个文本文件中,我想插入第三个数组的第一个元素。这就是为什么如果您也能告诉我这些指标有什么问题,我将不胜感激。
  • 另外我将增加每个数组的元素数量。我想这会更容易处理。
  • 您需要使用大括号来分隔至少第一个变量引用,即textFile=text_${i}_$j.txt 而不是textFile=text_$i_$j.txt。否则,它将下划线解析为变量名的一部分。我会在他们两个上使用大括号,只是为了对称:textFile=text_${i}_${j}.txt
  • @GordonDavisson,带大括号和不带大括号的两种情况都一样。
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多