2011-12-29 2 views
5

Я пытаюсь написать сценарий bash, и я столкнулся с проблемой цитирования.Использование нескольких слоев кавычек в bash

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

lwp-request -U -e -H "Range: bytes=20-30" 

Моего файл сценарий выглядит следующим образом:

CLIENT=lwp-request 
REQ_HDRS=-U 
RSP_HDRS=-e 
RANGE="-H "Range: bytes=20-30"" # Obviously can't do nested quotes here 
${CLIENT} ${REQ_HDRS} ${RSP_HDRS} ${RANGE} 

Я знаю, что я не могу использовать вложенные кавычки. Но как я могу это сделать?

ответ

12

Обычно, вы могли бы избежать внутренние кавычки с \:

RANGE="-H \"Range: bytes=20-30\"" 

Но это не будет работать при выполнении команды –, если вы положили eval, прежде всего вещь:

RANGE="-H \"Range: bytes=20-30\"" 
eval $CLIENT $REQ_HDRS $RSP_HDRS $RANGE 

Однако , так как вы используете bash, а не sh, вы можете поместить отдельные аргументы в массивы:

RANGE=(-H "Range: bytes=20-30") 
$CLIENT $REQ_HDRS $RSP_HDRS "${RANGE[@]}" 

Это может быть продлен до:

ARGS=(
    -U        # Request headers 
    -e        # Response headers 
    -H "Range: bytes=20-30"  # Range 
) 
$CLIENT "${ARGS[@]}" 
+0

Ускорение обратного слэша и использование 'eval' исправили его для меня. Благодаря! Я рассмотрю преобразование в массив аргументов позже. – abelenky

+1

@abelenky: пожалуйста, не используйте 'eval', он полон ловушек для неосторожных. Массивный подход гораздо надежнее. –

1

Вы можете использовать тот факт, что оба «» и «» может быть использован для строк.
Так что вы можете сделать что-то вроде этого:

x='Say "hi"' 
y="What's up?" 
+1

Это будет работать для создания строки, содержащей кавычки. Однако это не сработает, если вы попытаетесь передать его команде. Использование массива в соответствии с ответом грамотности (http://stackoverflow.com/a/8757164/1862009) - это то, что сработало для меня. – toxalot

0

попробовать это:

RANGE = '\ "- \" H Диапазон: число байт = 20-30 \ "\"

вы можете espape с помощью '' и \»

NO_ERROR = '' ошибки = \ "0 \" ';

+0

Что вы искали, чтобы найти 6-летний вопрос !? – abelenky

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