Как исправить 'в bash после проверки, выполняются ли операторы условия else'? - PullRequest
0 голосов
/ 18 апреля 2019

Я беру URL-адреса из файла, чтобы они могли использовать curl для загрузки изображений, после внесения изменений в URL URL=${URL%$'\r'} я запускаю цикл для чтения каждой строки, получая входные данные в переменных и классифицируя изображения по TensorFlow., если это инфографика, то он должен выполнить оператор if, иначе он должен выполнить оператор else.При выполнении сценария bash оба оператора if и else выполняются

в выполняемом операторе else, при печати echo ${var%$'something'} он ничего не печатает ... также сценарий работает нормально при получении вводас клавиатуры.

#!/bin/bash
while IFS= read -r file
do
  url=${file%$'\r'}
  var=`python test_python_classify.py $url`
  if [ $var == 1 ]
  then
    echo $var
    curl -o image.png $url
    python description1.py $url
  else
    echo "\n\n\n"
    echo ${var%$'yoyo'}
    echo "lol"
  fi
done < url.txt

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

ошибка:

Traceback (most recent call last):
  File "test_python_classify.py", line 3, in <module>
    URL = sys.argv[1]
IndexError: list index out of range
./pipeline1.sh: line 8: [: ==: unary operator expected

1 Ответ

1 голос
/ 19 апреля 2019

Есть несколько ошибок.

Первый $url пуст (возможно, пустая строка в вашем скрипте), что приводит к сбою python при попытке доступа к аргументу.В этом смысл этой ошибки:

URL = sys.argv[1]
IndexError: list index out of range

Затем вы смешиваете код возврата и возвращаемое значение в вашем скрипте:

var=`python test_python_classify.py $url`
if [ $var == 1 ]
  then

скрипт python завершает работу с кодом возврата 1, он не print 1. Фактически, ваш скрипт ничего не печатает (следы сбоев переходят на stderr), поэтому $var пусто, и вы получаете синтаксическую ошибку оболочки, потому что вы не защитили переменную кавычками.

./pipeline1.sh: line 8: [: ==: unary operator expected

Если вам нужно проверить код возврата, с помощью $? также отфильтруйте пустые URL-адреса (мой bashржавый, но это должно работать):

if [ ! -z "$url" ]
then
   python test_python_classify.py $url
   if [ $? == 1 ]
   then

Если скрипт Python печатает значение, сначала проверьте код возврата, чтобы убедиться, что оно выполнено успешно, а затем проверьте напечатанное значение

if [ ! -z "$url" ]
then
   var = $(python test_python_classify.py $url)
   # check if returncode is 0, else there was an error
   if [ $? == 0 ]
   then
      # protecting return with quotes doesn't hurt
      if [ "$var" == 1 ]
      then

Как предлагается в комментариях, это может использовать основную полную переписку Python, которая упростит все эти проблемы интерфейса bash / python.Что-то (не проверено), например:

import sys,subprocess  # we could use python script functions too
with open("url.txt") as f:
  for line in f:
     url = line.rstrip()
     if url:
         output = subprocess.check_output([sys.executable,"test_python_classify.py",url])
         output = output.decode().strip()  # decode & get rid of linefeeds
         if output == "1":
            print("okay")
            subprocess.check_call(["curl","-o","image.png",url])
            subprocess.check_call([sys.executable,"description1.py",url])
         else:
            print("failed: {}: {}".format(url,output))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...