Вопрос по bash – Построение командных строк с использованием переменных с различными уровнями кавычек и пробелами

3

У меня есть скрипт, который запускаетсяcurl, Я хочу, чтобы иметь возможность добавить-H параметр, если строка не пуста. Что является сложным, так это уровни цитирования и пробелы.

caption="Test Caption"

if [ "${caption}" != "" ]; then 
    CAPT=-H "X-Caption: ${caption}"
fi

curl -A "$UA" -H "Content-MD5: $MD5" -H "X-SessionID: $SID" -H "X-Version: 1"  $CAPT http://upload.example.com/$FN

Идея состоит в том, что переменная CAPT либо пуста, либо содержит требуемый заголовок -H в той же форме, что и другие, например,-H "X-Caption: Test Caption"

Проблема в том, что при запуске он интерпретирует назначение как команду, которая будет выполнена:

$bash -x -v test.sh
+ '[' 'Test caption' '!=' '' ']'
+ CAPT=-H
+ 'X-Caption: Test caption'
./test.sh: line 273: X-Caption: Test caption: command not found

Я пытался сбросить IFS перед кодом, но это не имело значения.

Ваш Ответ

3   ответа
8

caption="Test Caption"

if [[ $caption ]]; then 
    CAPT=(-H "X-Caption: $caption")
fi

curl -A "$UA" -H "Content-MD5: $MD5" -H "X-SessionID: $SID" -H "X-Version: 1"  "${CAPT[@]}" "http://upload.example.com/$FN"
Это отлично сработало для меня, большое спасибо :)
-1

curlв том, что при использовании-H возможность установить пользовательские заголовки, кажется, лучше всего работает, когда все после-H (то есть имя и значение пользовательского заголовка) защищены одинарными кавычками. Затем мне нужно было передать построенную строку черезeval заставить его работать.

Чтобы это было легче читать, я храню одиночную кавычку в переменной с именемTICK.

Пример:

TICK=\'
#
HDRS=""
HDRS+=" -H ${TICK}Content-MD5: ${MD5}${TICK}"
HDRS+=" -H ${TICK}X-SessionID: ${SID}${TICK}"
HDRS+=" -H ${TICK}X-Version: 1.1.1${TICK}"
HDRS+=" -H ${TICK}X-ResponseType: REST${TICK}"
HDRS+=" -H ${TICK}X-ID: ${ID}${TICK}"

if [ "${IPTC[1]}" != "" ]; then
    HDRS+=" -H ${TICK}X-Caption: ${IPTC[1]}${TICK}"
fi
if [ "${IPTC[2]}" != "" ]; then
    HDRS+=" -H ${TICK}X-Keywords: ${IPTC[2]}${TICK}"
fi

#
# Set curl flags
#
CURLFLAGS=""
CURLFLAGS+=" --cookie $COOKIES --cookie-jar $COOKIES"
CURLFLAGS+=" -A \"$UA\" -T ${TICK}${the_file}${TICK} "

eval curl $CURLFLAGS $HDRS -o $OUT http://upload.example.com/$FN
2

есть ли заголовок, вы можете интерполировать его, когда он должен быть там.

caption="Test Caption"
NOCAPT="yeah, sort of, that would be nice"

if [ "${caption}" != "" ]; then 
    unset NOCAPT
fi

curl ${NOCAPT--H "X-Caption: ${caption}"} -A "$UA" ...

Напомним, синтаксис${var-value} производитvalue еслиvar не установлен

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