2012-04-08 3 views
2

Я хочу показать содержимое файлов, поставляемых с моим скриптом оболочки, с помощью аргументов. Мне нужно сделать это, используя обычный цикл for (()), а НЕ - для цикла x в arr.Итерация через список аргументов с использованием цикла в сценарии оболочки?

Это мой код. Как правильно поместить имя файла для этой команды cat?

for ((i=1;$i<=$#;i=$i+2)) 
do 
    cat '$'$i #display the contents of the file currently being traversed 
done 
+0

Каким образом «для (())« нормального? Гораздо чаще используется другая форма. –

ответ

2

Вы можете использовать что-то вроде:

for ((i=1;$i<=$#;i=$i+1)) 
do 
    cat ${!i} #display the contents of the file currently being traversed 
done 

Соответствующий раздел руководства:

Если первый символ параметра восклицательным знаком, уровень переменной косвенностью вводится , Bash использует значение переменной , сформированное из остального параметра как имя переменной ; эта переменная затем расширяется, и это значение используется в остатке замещения , а не в значении самого параметра. Это называется косвенным расширением. Исключением являются расширения $ {! Prefix *} и $ {! Name [@]}, описанные ниже. Восклицательный знак должен немедленно следовать за левой скобой, чтобы вводил косвенное указание.

+0

Спасибо миллион tonio! :) – Ivin

2

Нормальное поведение цикла for заключается в повторении аргументов. Чтобы перебрать все аргументы:

#!/bin/sh -e 
for x; do cat $x; done 

Вы можете изменить, что немного работать только на любом другом аргументе, как вы в вашем примере многих различных способов. Одной из возможностей является: {! Уаг}

for x; do expr $((i++)) % 2 > /dev/null || cat "$x"; done 

Если вы настаиваете на использовании нестандартной формы, вы можете использовать bashism $, которые подведет в большинстве оболочек, или вы можете использовать eval

for ((i = 1; i <= $#; i += 2)) 
do 
    eval cat '"$'$i\" 
done 
Смежные вопросы