Во-первых, ваша переменная равна xfile
, но вы пытаетесь использовать переменную file
, перед которой стоит литерал x
.Я думаю, что x$file
должно быть $xfile
.
Во-вторых, вы выполняете команду file
для каждого файла и перезаписываете файл values
каждый раз, то есть появляется только последний.Вы можете исправить это, предварительно удалив файл и используя >>
(добавление) вместо >
(перезапись).
В-третьих, команда file
отлично способна обрабатывать несколько аргументов, так что вы действительнонужно только:
file * >values
Также используется *
, потому что *.*
- штука для Windows / DOS - если вам нужны все файлы в UNIX-подобных операционных системах, *
- правильная форма (или.*
также, если вы хотите скрытые файлы).
И, наконец, ни одно из этих предложений не решит вашу актуальную проблему, которая почти наверняка связана с наличием DOS-стиль окончания строк в вашем файле.Это сообщение об ошибке соответствует почти идеально тому, что вы увидите в этом случае.
В моей системе, когда я вводю ваш скрипт с окончанием строки DOS, я получаю то же сообщение об ошибке (в основном).
Если вы введете od -xcb check.sh
, вы, скорее всего, увидите что-то вроде:
0000020 0a0d 6f64 0a0d 6966 656c 2220 7824 6966
\r \n d o \r \n f i l e " $ x f i
015 012 144 157 015 012 146 151 154 145 040 042 044 170 146 151
с символами \r
, указывающими неправильные окончания строк.
Вы можете использовать ваш любимый (приличный) редактор для просмотра и удаления этих файлов или просто установить dos2unix
с apt-get
(хотя у вас это может уже быть) и сделать:
# sudo apt-get install dos2unix ## only if you don't have it already.
dos2unix check.sh >check2.sh
, а затем использовать check2.sh
.
Хотя, имейте в виду, однострочный:
file * >values
по-прежнему лучше, чем цикл for
(но вы все равно захотите убедиться, что выиспользуется конец строки UNIX).