KSH for loop работает на Solaris / Mac, но не на Red Hat Linux - PullRequest
2 голосов
/ 02 декабря 2010

Следующий скрипт Ksh выдает сообщение об ошибке «Нет такого файла или каталога» в системе Red Hat Linux. У кого-нибудь есть решение?

#!/usr/bin/ksh
for f in `cat files.dat`
do
  wc $f
done

Например, files.dat имеет 3 строки данных, и каждая строка представляет собой файл в текущем каталоге, из которого выполняется скрипт.

a.c
a.h
b.c

Обратите внимание, что то же самое для цикла сгенерировало то же сообщение об ошибке при запуске из командной строки.

Работает на Solaris / Mac, но не на системе Red Hat.

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Вместо for ... cat вы должны использовать

while read -r f
do
    wc "$f"
done < files.dat

И вы должны использовать $() вместо обратных кавычек, когда вам нужно выполнить подстановку команд.

Но ваша проблема в том,возможно, что файлы a.c и т. д. отсутствуют, имеют разные имена, невидимые символы в именах или окончания строк в files.dat имеют CR / LF (стиль DOS / Windows) вместо \n (LF only - в стиле Unix) или в файле есть нечетные символы.

1 голос
/ 02 декабря 2010

Вы должны правильно процитировать свои аргументы, другими словами, используйте "$f", а не $f. О кошке - это в основном задокументировано здесь: http://porkmail.org/era/unix/award.html

Что, вероятно, лучше подходит, это xargs -a thatfile wc.

...