【问题标题】:loops in shell scriptshell脚本中的循环
【发布时间】:2013-07-09 19:12:51
【问题描述】:

我有两组数据,比如a=file1 file2 file3 和b=location1 location2 location3。 现在我需要循环复制file1到location1,file2到location2和file3到location3。

如果我使用for循环,那么在内循环的第一次迭代之后,它应该回到外循环,取第二个值,再到内循环取第二个值,依此类推。基本上,内循环不应该对外循环中的每个值进行迭代。

有没有办法做到这一点?

提前致谢。 苏迪尔

【问题讨论】:

  • 文件列表来自哪里?你走的是目录还是文件夹?
  • 您使用的是哪个外壳(以及什么版本)?

标签: arrays shell unix loops


【解决方案1】:

听起来你太复杂了:

a=(file1 file2 file3)
b=(location1 location2 location3)

for (( idx=0; idx<${#a[@]}; idx++ )); do
    cp -v "${a[idx]}" "${b[idx]}"
done

【讨论】:

  • 这就像一个魅力。非常感谢您的时间。我不能使用 perl,因为这是更大脚本的一部分。谢谢大家
【解决方案2】:

您可以创建 bash 数组并让它为您工作:

declare -a f=( "file1" "file2" "file3" )
declare -a d=( "location1" "location2" "location3" )
c=0
for i in ${f[@]}; do
   echo $i ${d[$c]}
   ((c++))
done

或者没有数组,类似这个脚本的东西也应该适合你:

ci=0
for i in file1 file2 file3; do 
   ((ci++))
   cj=1
   for j in location1 location2 location3; do
      [[ $ci = $cj ]] && echo $i $j && break
     ((cj++))
   done
done

输出:

file1 location1
file2 location2
file3 location3

【讨论】:

    【解决方案3】:

    当然$SHELL 在这里是最简单的,尽管一旦你开始用bash 做数组,这种优势就会开始消散;-) 所以,为了比较,这里有一个简单的非单行perl 方法:

     #!/usr/bin/env perl
     my @arraya = qw/ file1 file2 file3/ ; 
     my @arrayb = qw/ location1 location2 location3/ ;
     foreach my $i ( 0 .. $#arraya ) {`cp $arraya[$i] $arrayb[$i]` }
    

    @arraya 和@arrayb 可以通过/m// 匹配和过滤、greping、finding 等以编程方式构造成非常大的列表。

    c.f. 基于perl 的rename 工具。

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多