2016-01-22 5 views
0

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

listfile 3 test.txt test1.txt test2.txt 

В основном то, что я пытаюсь сделать, это поместить имена файлов под 2 строки <h> и </h>. Как это:

<h> 
test.txt 
test1.txt 
test2.txt 
</h> 

Количество вещей, которые могут пойти в том, что определяется первым аргументом, который для приведенного выше примера является 3.

Другим примером может быть, если я бегу что-то вроде:

listfile 1 test.txt test1.txt test2.txt 

В этом случае каждый <h></h> может содержать 1 файл. так что результат будет выглядеть примерно так:

<h> 
test.txt 
</h> 
<h> 
test1.txt 
</h> 
<h> 
test2.txt 
</h> 

Вот моя попытка:

#!/bin/sh 

value=0 
arg1=$1 
shift 
for i in "[email protected]" 
do 
    if [ $value -eq 0 ]; then 
     echo "<h>" 
    fi 
    if [ $value -lt $arg1 ]; then 
     echo "$i" 
     value=`expr $value + 1` 
    fi 
    if [ $value -ge $arg1 ]; then 
     echo "</h>" 
     value=`expr $value - $value` 
    fi 
done 

До сих пор я получил его на работу, но единственная проблема в том, что последний </h> не кажется, чтобы выводимый и я не могу понять, как это исправить. Если я пытаюсь:

listfile 4 test.txt test1.txt test2.txt 

он выводит, но это </h> отсутствует:

<h> 
test.txt 
test1.txt 
test2.txt 

Если кто-нибудь может дать мне подсказку, что будет очень ценится.

+0

'value = $ (expr $ value - $ value)' легче записать 'значение = 0'. Простым способом является тестирование в конце: если значение отличное от нуля, напечатайте завершающий '' –

ответ

1
#!/bin/sh 

value=0 
arg1=$1 
shift 
echo "<h>" 
for i in "[email protected]" 
do 
    if [ $value -ge $arg1 ]; then 
     echo "</h>" 
     echo "<h>" 
     value=`expr $value - $value` 
    fi 
    echo "$i" 
    value=`expr $value + 1` 
done 
echo "</h>" 
0

Я понимаю, чего вы хотите достичь. Вы предоставляете набор позиционных параметров с ведущим номером, и вы хотите сгруппировать это число параметров между тегами <h>...</h>.

Вот несколько иной подход, чем другие. Проверка была добавлена ​​для проверки того, обеспечивает ли ваш первый позиционный параметр равномерное распределение оставшихся строк между тегами и предоставляет ошибку, если количество строк не равномерно делится на группы этого числа.

#!/bin/sh 

arg1="$1" 
shift 
nargs="$#" 
if [ $(((nargs - arg1) % arg1)) -ne 0 ] 
then 
    printf "error: arg1 provides unequal line distribution\n" 
    exit 1 
fi 
echo "<h>" 
for ((i = 1; i <= $nargs; i++)) 
do 
    echo "$1" 
    if [ $((i % arg1)) -eq 0 ] 
    then 
     if [ "$i" -lt "$nargs" ] 
     then 
      printf "</h>\n<h>\n" 
     else 
      printf "</h>\n" 
     fi 
    fi 
    shift 
done 

Использование/выход

$ sh outputh.sh 1 line.txt line1.txt line2.txt 
<h> 
line.txt 
</h> 
<h> 
line1.txt 
</h> 
<h> 
line2.txt 
</h> 

$ sh outputh.sh 2 line.txt line1.txt line2.txt 
error: arg1 provides unequal line distribution 

$ sh outputh.sh 3 line.txt line1.txt line2.txt 
<h> 
line.txt 
line1.txt 
line2.txt 
</h> 

Примечание:, если вы хотите, чтобы неравное распределение линий между тегами, например:

$ sh outputh2.sh 2 line.txt line1.txt line2.txt 
<h> 
line.txt 
line1.txt 
</h> 
<h> 
line2.txt 
</h> 

затем несколько дополнительных все настройки требуются. Ниже приведены все распределения - равные или нет:

#!/bin/sh 

closed=1 
arg1="$1" 
shift 
nargs="$#" 
echo "<h>" 
for ((i = 1; i <= $nargs; i++)) 
do 
    echo "$1" 
    if [ $((i % arg1)) -eq 0 ] 
    then 
     if [ "$i" -lt "$nargs" ] 
     then 
      printf "</h>\n<h>\n" 
      closed=1 
     else 
      printf "</h>\n" 
      closed=0 
     fi 
    fi 
    shift 
done 

if [ "$closed" -eq 1 ] 
then 
    echo "</h>" 
fi 
Смежные вопросы