2016-10-23 3 views
0

У меня есть 7K нечетных файлов в папке, которую я хочу организовать в другую папку на основе шаблона файла. Я дал некоторые фиктивные данные и сценарий, чтобы продемонстрировать проблему, с которой я столкнулся. Шаблоны на самом деле больше, чем те, которые показаны в примере.BASH: используйте переменную for-loop как другую переменную

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 
+0

Хорошо, ваш скрипт делает именно то, что вы хотите? Что именно вы хотите от сценария? – sjsam

ответ

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 
+0

Спасибо, это просто отлично! Я просто читал, и я даже мог попробовать ассоциативный массив и хранить все вместе и называть то, что хочу на каждой итерации. – dexnow

0

Хотя кажется, что массив будет работать для вас, вы могли бы достичь косвенную ссылку на переменную с помощью "${!pattern}" вместо $$pattern. (У вас должен быть двойной аргумент аргумента egrep, но ot не поможет, потому что $$ является заменой оболочки (shell pid), а не ссылкой на косвенные переменные.)

Смежные вопросы