2013-05-21 7 views
2

Я пытаюсь напечатать имя файла, который содержит номера десятичной запятой ... сказатьуказатель в скрипте оболочки?

L2.3stop.txt 

У меня есть переменные, определенные как:

z1=2.3 
z2=3.4 
z3=7.8 
z4=8.9 

и так далее

в цикле i работает от 1 до 5

Внутри петли, если я делаю

temp=`echo z$i` 

, а затем напечатать имя файла с помощью

echo L${temp}stop.txt 

он просто печатает

Lz1stop.txt 
Lz2stop.txt 

и т.д ..

Как я могу напечатать нужное имя файла ....

Я также пробовал использовать

echo L$((z$i))stop.txt 

, но это работает только при z1, z2, z3 и т.д. являются целыми числами, а не плавающие числа ....

+1

Знаете ли вы, что у Bash есть [массивы] (http://tldp.org/LDP/abs/html/arrays.html)? – Mat

ответ

4

Я надеюсь, что это помогает:

z1=2.3 
z2=3.4 
z3=7.8 
z4=8.9 

for i in {1..4};do 
     echo L$(eval "echo \$z"$i)stop.txt 
done 

или это должно работать также:

for i in {1..4};do 
    echo L$(echo $(echo "\$z$i"))stop.txt 
done 

выходы:

L2.3stop.txt 
L3.4stop.txt 
L7.8stop.txt 
L8.9stop.txt 
2

Это не портативный, но в Баш вы можете сделать:

name=z$i 
echo ${!name} 
2

Best (с использованием массива):

z=(2.3 3.4 7.8 8.9 9.8) # Added fifth value 
for x in "${z[@]}" 
do 
    echo L${x}stop.txt 
done 

Менее хорошо (с использованием indirect expansionbash функция):

z1=2.3 
z2=3.4 
z3=7.8 
z4=8.9 
z5=9.8 # Added fifth value 

for i in {1..5} 
do 
    v=z$i 
    echo L${!v}stop.txt 
done 

Оба продукта:

L2.3stop.txt 
L3.4stop.txt 
L7.8stop.txt 
L8.9stop.txt 
L9.8stop.txt 

Как избежать использования eval, который не является слишком вредным в этом контексте, но является опасным (и его трудно использовать правильно) в целом.

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