2016-07-27 4 views
1

Обычно для вставки кавычки в строку используется \ (обратная косая черта).Я хочу вставить одну цитату в строку

Имеет ли обратная косая черта другое значение в сценарии Bash?

Мой код ниже не работает: знак цитаты не был включен, и следующие ошибки сообщили:

recursive_merge.sh: line 7: unexpected EOF while looking for matching `'' 
recursive_merge.sh: line 14: syntax error: unexpected end of file 

У меня нет объяснения. Строка 14 даже не существует.

#!/bin/bash 
#############this file should be in the directory directly upper than p0x. sphnum.txt should also be at the same directory 
for i in 02 03 04 05 06 07 09 10 11 12 13 14 15 16 17 20 21 22 23 24 25; do 
x=$(grep $i sphnum.txt |cut -c5-6) 
y=$(grep $i sphnum.txt |cut -c8-9) 
z=$(echo '\''$i'.ala.r'$x'.sph '$i'.ala.r'$y'.sph\'') 
w=$(echo $i'.ala.r'$x'r'$y'.sph') 
echo $z 
echo $w 
cd p$i/spheres.10_2_75/sph/ 
/project/Biogroup/Software/Docking/MergeSpheres.pl -s $z -o $w -n 500 & 
cd ../../../ 
done 
+5

Используйте [\ [shellcheck \ ]] (http://shellcheck.net) – sjsam

+0

@tripleee: Пока [связанный вопрос] (http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable?noredirect= 1 & lq = 1), как правило, связаны друг с другом, ни он, ни его ответы не адресуют _embedding_ одиночные кавычки внутри (одиночные кавычки) строки или не генерируют одиночные одиночные кавычки, которые находятся в центре внимания этого вопроса. – mklement0

+0

@ mklement0 На самом деле, http://stackoverflow.com/a/27701642/874188 предлагает использовать двойные кавычки вокруг одинарных кавычек, когда вам нужна буквальная одинарная кавычка. Но я в порядке, оставив этот вопрос открытым. (Для контекста для будущих читателей я ранее отмечал это как дубликат, но он был возвращен.) – tripleee

ответ

3

Как tripleee указывает в комментариях по этому вопросу, то лучший подход в данном конкретном случае является использование двойных кавычках строку, в которой вы можете вставлять как ссылки на переменные (например, $i) и одинарные кавычки as-is; например: z="'$i.ala.r$x.sph $i .ala.r$y.sph'"
Этот ответ посвящен различным подходам к созданию/внедрению литералов ' символов. в строках, начиная с заблуждения ОП.

Использование '\'' предполагает, что вы смущены обходной путь, который обычно используется для «встраивания» апостроф в общей одинарных кавычках строки, которая не, что делает ваш код на z=... линия, потому что он начинает с '\''.

Если упростить вашу команду, мы получим:

echo '\''$i 

который ошибки передается синтаксиса, потому что Баш одиночных кавычки несбалансированного, потому что '\'самих по себе считаются полным синглом -котированная строка, содержащая литерал \, а затем открытие' of second одинарная кавычка, которая никогда не бывает закрыт.

Опять же стоит отметить, что "'$i" является лучшим решением для этой конкретной проблемы: ' может быть вложен как есть, и в том числе ссылки на переменную $i внутри двойные кавычками защищает свое значение от потенциально нежелательных word-splitting and filename expansion (globbing).

POSIX-подобные оболочки не обеспечивают способ вставлять одиночные кавычки внутри одинарных кавычках строки - даже не вытекания. Следовательно, \ в '\' просто рассматривается как литерал (см. Ниже обходной путь).

В остальном этом ответе показаны все подходы к выдаче буква ', как внутри, так и снаружи, строки, указанные в кавычках.


Чтобы создать одиночную кавычку вне из строки в кавычках, просто используйте \':

$ echo I am 6\' tall. 
I am 6' tall. 

This кавычки (побег) только индивидуальный характер ', используя \. Но учтите, что токены, помещенные вне контекста строки с одним или двумя кавычками в командной строке, подчиняются word-splitting and filename expansion (globbing).


Чтобы использовать апостроф внутри двойных кавычках строки, использовать его как есть (не миновать требуется):

$ echo "I am 6' tall." 
I am 6' tall. 

Это лучший выбор, если вы хотите для вставки ссылок переменных (например, $i) или команд (через подстановки команд, $(...)) в вашу строку (вы можете подавить интерполяцию путем экранирования $ как \$).


Чтобы использовать апостроф Внутри одинарными кавычками строка (в которой нет интерполяции (дополнения) не выполняется в соответствии с проектом), вы должны использовать обходной:

$ echo 'I am 6'\'' tall.' 
I am 6' tall. 

Обходное решение необходимо с помощью однокабельных строк, не поддерживающих встроенные одинарные котировки вообще; '\'' часть имеет смысл только «внутри» одинарных кавычках в том, что:

  • ведущий ' завершает одинарных кавычках до сих пор
  • \' затем производит ' буквальным индивидуально отделался \за пределами контекст цитируемой строки.
  • конечный ' затем «перезапускает» оставшуюся часть строки с одной кавычкой.

Другими словами: В то время как вы не можете напрямую вставлять апостроф, вы можете разбить одинарных кавычках на несколько частей, вставить индивидуально \ убежал ' экземпляры вне в одинарных кавычках, как это необходимо, и пусть конкатенация строки Bash (которая автоматически присоединяется непосредственно к соседней строке) объедините ее все вместе, чтобы сформировать одну строку.


chepner точек в комментарии, что вы можете в качестве альтернативы используют here-document с цитируемого открытия разделителем, который действует как одинарных кавычках строки, позволяя вложение ' символов:

read -r var <<'EOF' # quoted delimiter -> like a '...' string, but ' can be embedded 
I am 6' tall. 
EOF 

С неупомянутый открывающий разделитель, здесь-документ действует как двойных кавычках строки, которая, так же как и последний, также позволяет встраивание ', а также поддерживает расширения:

read -r var <<EOF # unquoted delimiter -> like a "..." string 
$USER is 6' tall. 
EOF 

Наконец, если остальные POSIX- совместимый не является обязательным, вы можете использовать строку ANSI C-quoted string, которая позволяет встраивать одинарные кавычки с \';
отмечают, что такие строки интерпретировать управляющие последовательности управления символьные, такие как \n, но в остальном, как обычный одинарных кавычках строки, не выполняют интерполяцию переменных ссылок или подстановки команд:

$ echo $'I am 6\' tall.' 
I am 6' tall. 
+1

Вы можете включить одну цитату, если вы считаете цитируемый здесь-doc-разделитель как строку с одним кавычком. ('IFS = read -r a << 'EOF' '$ a EOF' - извинения за форматирование - является законной, хотя и многословной, альтернативой простому назначению.) – chepner

+0

Спасибо, @chepner. Я добавил ваше предложение к ответу. – mklement0

+0

Большое вам спасибо. Вы так добры даже новичок, как я. – SIMONSON92

Смежные вопросы