2015-04-03 3 views
2

Я пробовал cat файл с именем file sth.txt. Когда я пишуКак файл cat с пробелом в имени файла в BASH?

cat "file sth.txt" 

Это прекрасно работает.

Когда я сохраняю file sth.txt в переменную file и я исполню

cat "$file" 

Система записывает

cat: file: No such file or directory 
cat: sth.txt: No such file or directory 

Я хочу cat файл с переменной и иметь в нем более одного файла. Для имен файлов без места это работает. Может ли кто-нибудь дать мне совет?

+0

Вы используете 'cat '$ file" или 'cat $ file'? Потому что приведенная версия должна работать нормально. –

+0

Это не сработает, если у меня в моей переменной больше одного файла. Как мне это сделать? –

+0

Если ваша переменная содержит более одного имени файла, вы не можете поддерживать файлы с пробелами в именах. Не помещайте более одного имени файла в одну и ту же переменную. Используйте массив или несколько аргументов. –

ответ

0

Попробуйте это, так как терминал Mac OS X имеет дело с такими случаями.

cat /path/to/file\ sth.txt 

Вы можете сделать то же самое с вашим скриптом

sh script.sh /path/to/file\ sth.txt 
+0

Я получаю имя файла как аргумент скрипта. У меня это в 1 доллар. Имя файла - «файл sth.txt». –

2

Вы уверены, что ваша переменная содержит правильные данные? Вы должны бежать путь в переменной, а также, либо с "" или '', или с помощью :

[email protected]:~$ echo test > "file sth.txt" 
[email protected]:~$ var=file\ sth.txt 
[email protected]:~$ cat "$var" 
test 
[email protected]:~$ var="file sth.txt" 
[email protected]:~$ cat "$var" 
test 

Version = GNU bash, version 4.3.33(1)-release (i686-pc-cygwin)

3

Вы должны присвоить переменную так:

file="file sth.txt" 

или:

file="$1" 
+1

Это не работает. Он пишет мне ту же ошибку. –

+1

Это работает для меня. Как вы называете свой скрипт? –

0

Использование массива:

# Put all your filenames in an array 
arr=("file sth.txt") # Quotes necessary 
arr+=("$1")   # Quotes necessary if $1 contains whitespaces 
arr+=("foo.txt") 

# Expand each element of the array as a separate argument to cat 
cat "${arr[@]}"  # Quotes necessary 

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