BASH:使用for循环变量作为另一个变量

时间:2016-10-23 23:46:56

标签: bash shell loops unix

我在文件夹上有7K个奇怪的文件,我想根据文件的模式组织到不同的文件夹中。我已经给出了一些虚拟数据和脚本来演示我面临的问题。这些模式实际上比示例中显示的更多。

folder/
0001_x.dat
0002_y.dat
0003_y.dat
0004_y.dat
0005_y.dat
0006_y.dat
0007_y.dat
0008_y.dat
0009_y.dat
...

现在脚本......

#!/bin/bash 

p1="x|y|z"
p2="a|b|c"
p3="m|n|o"
FILES=$(find . -type f)

for pattern in p1 p2 p3; do 
  mkdir $pattern-folder
  echo "$FILES" | egrep $$pattern | while read file ; do mv $file $pattern-folder ; done      # << the "$$pattern" doesn't work. What should be the right syntax here ?
  done
done

我最终以下面的方式做到了,但我觉得它不干净。欢迎所有健康的批评和建议。

for pattern in p1 p2 p3; do 
  mkdir $pattern-folder
  echo "$FILES" | egrep $p1 | while read file ; do mv $file $p1-folder
  echo "$FILES" | egrep $p2 | while read file ; do mv $file $p2-folder
  echo "$FILES" | egrep $p3 | while read file ; do mv $file $p3-folder
  done
done

2 个答案:

答案 0 :(得分:0)

#!/bin/bash

# make an array
PATTERNS[0]="x|y|z"
PATTERNS[1]="a|b|c"
PATTERNS[2]="m|n|o"

# iterate
for var in "${PATTERNS[@]}"
do
  echo "${var}"
  # do something
done

答案 1 :(得分:0)

虽然看起来数组对您有用,但您可以使用"${!pattern}"代替$$pattern来实现间接变量引用。 (您应该将参数双引号引用egrep,但不会有帮助,因为$$是shell替换(shell的pid)而不是间接变量引用。)