2016-08-09 9 views
0

У меня есть Баш скрипт так:Как сделать скрипт bash брать имена файлов с пробелами?

myfiles=("file\ with\ spaces.csv") 

for file_name in "${myfiles[@]}" 
do 
     echo "removing first line of file $file_name" 
     echo "first line is `head -1 $file_name`" 
     echo "\n" 
done 

но он не признает пространства по какой-то причине, даже если я заключил его в двойных кавычках "":

head: cannot open ‘file\\’ for reading: No such file or directory 

Как это исправить ?

ответ

4

Вам нужны двойные кавычки внутри обратных циклов. Наружного набора недостаточно.

echo "first line is `head -1 "$file_name"`" 

Кроме того, не указывайте обратную косую черту в имени файла, так как оно уже указано. Котировки или обратная косая черта, но не оба.

myfiles=("file with spaces.csv") 
myfiles=(file\ with\ spaces.csv) 
1

Для расширения @JohnKugelman's answer:

  • Quoting занимает немного привыкнуть в Bash. В качестве простого правила используйте одинарные кавычки для статических строк без специальных символов, двойные кавычки для строк с переменными и $'', цитирующие строки со специальными символами.
  • В каждом command substitution есть отдельный контекст цитирования.
  • $() - это более четкий способ установления подстановки команд, поскольку он может быть вложен намного проще.

Следовательно, вы обычно пишете myfiles=('file with spaces.csv') и echo "first line is $(head -1 "$file_name")".