sh shell скрипт для работы с циклом for - PullRequest
0 голосов
/ 27 октября 2011

Я использую скрипт sh shell для чтения файлов папки и отображения на экране:

for d in `ls -1 $IMAGE_DIR | egrep "jpg$"`
do
  pgm_file=$IMAGE_DIR/`echo $d | sed 's/jpg$/pgm/'`

  echo "file  $pgm_file";
done

результат вывода читается построчно:

file file1.jpg

file file2.jpg

file file3.jpg

file file4.jpg

Поскольку я не знаком с этим языком, мне бы хотелось, чтобы результат выводил первые 2 результата в одной строке следующим образом:

file file1.jpg; файл file2.jpg;

file file3.jpg; файл file4.jpg;

В других языках я просто поставил d ++, но в этом случае он не работает.

Это будет выполнимо? Я буду рад, если вы предоставите мне пример кода.

заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 27 октября 2011

Пусть оболочка сделает больше за вас:

end_of_line=""
for d in "$IMAGE_DIR"/*.jpg
do
  file=$( basename "$d" )
  printf "file %s; %s" "$file" "$end_of_line"
  if [[ -z "$end_of_line" ]]; then
    end_of_line=$'\n'
  else
    end_of_line=""
  fi

  pgm_file=${d%.jpg}.pgm
  # do something with "$pgm_file"
done
1 голос
/ 27 октября 2011
for d in "$IMAGE_DIR"/*jpg; do
  pgm_file=${d%jpg}pgm
  printf '%s;\n' "$d"
done |
  awk 'END { 
        if (ORS != RS)
          print RS
          }
       ORS = NR % n ? FS : RS
       ' n=2

Установите n на любое значение, которое вам нужно. Если вы используете Solaris , используйте nawk или / usr / xpg4 / bin / awk (не используйте / usr / bin / awk ).

Обратите внимание, что я пытаюсь использовать стандартный синтаксис оболочки, учитывая, что ваш вопрос sh связан (то есть вы не упомянули bash или ksh , например).

0 голосов
/ 27 октября 2011

Зачем вообще использовать цикл? Как насчет:

ls $IMAGE_DIR | egrep 'jpg$' |
   sed -e 's/$/;/' -e 's/^/file /' -e 's/jpg$/pgm/' |
   perl -pe '$. % 2 && chomp'

(Perl просто удаляет все остальные символы новой строки. Вы можете вставить пробел и добавить завершающий символ новой строки, если последняя строка нечетного числа.)

0 голосов
/ 27 октября 2011

Как-то так внутри цикла:

echo -n "something; "
[[ -n "$oddeven" ]] && oddeven= || { echo;oddeven=x;}

должен сделать.

Три на строку будут что-то вроде

[[ "$((n++%3))" = 0 ]] && echo

n=1) перед входом в цикл.

...