Команда Construct на основе информации времени выполнения - PullRequest
0 голосов
/ 22 марта 2020

Мне нужно запустить скрипт оболочки в sh. Как мне обойти отсутствие массивов для динамического построения команды без проблем?

Вот блок кода, который я пытаюсь исправить:

CURL_ARGS=('--noproxy' '*' '--verbose' '--silent' '--include' '--write-out' '%{http_code}')
if [ "$CURL_HOST_HEADER" != "" ]; then CURL_ARGS+=(--header "$CURL_HOST_HEADER"); fi
CURL_ARGS+=("http://$CURL_HOST:$CURL_PORT$CURL_PATH")

echo Proceeding with curl cmd: curl "${CURL_ARGS[@]}"

n=0
until [ $n -ge 5 ]
do
    n=$[$n+1]
    CURL_RESPONSE=$(curl "${CURL_ARGS[@]}")
    PAGE=${CURL_RESPONSE:0:-3}
    HTTP_STATUS=${CURL_RESPONSE: -3}

    if [ "$HTTP_STATUS" != "200" ]
    then
        echo "Curl failed with http status $HTTP_STATUS. Retrying shortly if attempts remain"
        sleep 15
    else
        break
    fi
done

if [ "$HTTP_STATUS" != "200" ]
then
    LOGFILE=curlable-error-page-$(date +%s).html
    echo "CURL CMD:" > $LOGFILE
    echo "curl ${CURL_ARGS[@]}" >> $LOGFILE
    echo "STATUS:" >> $LOGFILE
    echo "$HTTP_STATUS" >> $LOGFILE
    echo "RESPONSE:" >> $LOGFILE
    echo "$PAGE" >> $LOGFILE
    exit 1
fi

1 Ответ

1 голос
/ 22 марта 2020

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

В качестве примера я буду притворяться заголовок передается как аргумент, а не как глобальная переменная, такая как хост, порт и путь.

run_curl () {
  # save any arguments first
  curl_host_header=$1

  # Repurpose $@ for use when you call curl
  set -- '--noproxy' '*' '--verbose' '--silent' '--include' '--write-out' '%{http_code}'
  if [ -n "$curl_host_header" ]; then
      set -- "$@" --header "$curl_host_header"
  fi
  set -- "http://$CURL_HOST:$CURL_PORT$CURL_PATH" 


  n=0
  until [ "$n" -ge 5 ]
  do
    n=$(($n+1))
    curl_response=$(curl "$@")
    page=${curl_response:0:-3}
    http_status=${curl_response : -3}

    if [ "$http_status" != "200" ]
    then
      echo "Curl failed with http status $HTTP_STATUS. Retrying shortly if attempts remain"
      sleep 15
    else
      break
    fi
  done

  if [ "$http_status" != "200" ]
  then
    logfile=curlable-error-page-$(date +%s).html
    {
      echo "CURL CMD:"
      echo "curl $*"  # $* is fine for embedding in a larger string
      echo "STATUS:"
      echo "$http_status"
      echo "RESPONSE:"
      echo "$page"
    } > "$logfile"
    exit 1
  fi
}

run_curl                      # No extra headers
run_curl "$CURL_HOST_HEADER"  # Extra header 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...