ошибка дополнительного операнда базового имени

Предполагая, что файл является файлом TSV ("значения, разделенные табуляцией" ), используяcsvkit:

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

Выходные данные будут правильно отформатированы в формате CSV, но их можно легко изменить обратно в TSV:

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

Параметр -cдля csvcutтакже может принимать числа и диапазоны, а также может использоваться для перестановки столбцов входных данных (функция, которую я часто пропускаю в стандартном cutутилита ).

0
10.11.2018, 16:28
1 ответ

Команда basename $fileиспользует переменную без кавычек. Значение переменной будет разделено на отдельные аргументы (, и каждый аргумент будет дополнительно подвергаться подстановке имен файлов )и передаваться утилите basename.

Эта утилита ожидает один или два аргумента. С двумя аргументами он вернет имя файла без пути к каталогу и дополнительно обрежет второй аргумент в конце имени (, так что basename path/to/file.txt.txtвозвращаетfile). Вы даете ему четыре аргумента, так как именно на столько слов разбивается имя файла JERASH - XZ 837367432.pdf.

Вместо этого процитируйте расширение переменной $file:

filenamenoext=$(basename "$file".pdf)

(обратите внимание, что filenamenopathне нужен, если он вам не понадобится позже для чего-то другого)

См. также:

Кроме того, при использовании printfдля печати переменных данных используйте строку формата и заключите переменную в кавычки:

printf 'Filename without path: %s\n' "$filenamenopath"
6
28.01.2020, 02:23

Теги

Похожие вопросы