Как да продължа скрипта, ако ако е невярно? Множество други

Така че имам този скрипт, искам скриптът да тества за второто условие, ако "if" е невярно, което е в elif, за да тества дали е вярно. Освен ако не е невярно, което продължава и тества следващия elif. По принцип множество „други“.

#Basically It turns a argument into a variable. Because that can't 
#work in an if function.
#What the script is doing is its setting variables for the python script
#What vvTHISvv does is it turns the argument into a variable. 
if [[ "$1" != "" ]]; then
    VAR="$1"
else
    VAR=.
fi
if [[ "$2" != "" ]]; then
    VAR2="$2"
else
    VAR2=.
fi
if [[ "$3" != "" ]]; then
    VAR3="$3"
else
    VAR3=.
fi


if [[ ${2} = ${VAR2} ]]
#${2} =  ${2}
then
    echo "I am condition number 1"
    #outputs a number
    ./script.py "${VAR}" "`cat ${VAR2}` `echo ${VAR3}`"
elif [[ ${3} = "${VAR3}" ]]
#${3} = ${3}
then
    echo "I am condition number 2"
    #outputs a number

    ./script.py "${VAR}" "`echo ${VAR2}` `cat ${VAR3}`"
elif [[ ${2} = "${VAR2}" ]] || [[ ${3} = "${VAR3}" ]]
then
    echo "I am condition number 3"
    #outputs a number
    ./script.py "${VAR}" "`cat ${VAR2}` `cat ${VAR3}`"
else 
    echo "I am condition number 4"
    #outputs a number
    ./script.py "${VAR}" "${VAR2} ${VAR3}"
fi

Ако стартирам според първото условие, работи

I am condition number 1
#*Insert whatever that python script did. Lets say it outputs "2"

Ако обаче тествам според условие номер 2

I am condition number 1
#*insert a bunch of errors
#related to the fact that its rolling based on the first "if"

Не работи и просто се върти за условие номер 1.

Ако имаше само две условия, просто щях да сложа „ако“ и „иначе“, но как да го направите с четири условия.

Във всеки случай VAR и ${1} са едно и също нещо, причината, поради която те са променлива, е да се заобиколи фактът, че условието и аргументът в ./script.py са едно и също нещо. И не можете точно да зададете тези две равни едно на друго като условие в оператор IF.


person Caucasian Malaysian    schedule 17.05.2018    source източник
comment
Третото ви условие никога няма да бъде изпълнено, тъй като е първото или второто условие, така че едно от тях трябва вече да е било вярно. Освен това, не разбирам напълно въпроса. Какво не е наред с това, което имате в момента?   -  person Benjamin W.    schedule 18.05.2018
comment
По принцип искам скриптът да се изключи от elif, ако if е false. Така че ако ако води до грешка. След това просто го пропуска и преминава към следващия, Елиф.   -  person Caucasian Malaysian    schedule 18.05.2018
comment
Можете ли да предоставите минимален възпроизводим пример -- код някой друг може да стартира, за да види проблем с тях? Замяната на вашия ./script.py с някои echo би помогнала. Задаването на вашите променливи на конкретна стойност, която причинява разликата между планирания и действителния резултат (така че някой може да го стартира сам, за да види проблема и/или да тества предложена корекция), по същия начин. Както е, трудно е да знаеш какво искаш.   -  person Charles Duffy    schedule 18.05.2018
comment
Между другото, като някои стилистични отклонения, които не са свързани с въпроса, обратните отметки са силно отхвърлени в полза на $(), а имената на променливите с главни букви се използват за променливи, които имат значение за самата обвивка -- собствените ви имена трябва да са с малки букви, за да се предотвратят потенциални конфликти. Вижте четвъртия параграф на pubs.opengroup.org/onlinepubs/9699919799/basedefs/ на последния и wiki.bash-hackers.org/scripting/obsolete на бившия.   -  person Charles Duffy    schedule 18.05.2018
comment
За пояснение: причината, поради която Чарлз Дъфи иска MCVE, е, че клонът на условие номер 1 аз съм ще бъде изпълнен само ако ${1} съвпада с ${VAR2} (като последното се третира като глобален модел), така че е важно е да знаете какви са действителните им стойности. Освен това бих препоръчал да стартирате скрипта си през shellcheck.net - ще има куп препоръки.   -  person Gordon Davisson    schedule 18.05.2018
comment
Съжалявам, че трябваше да направя това по-ясно. Така че променливите са основно аргументи, това, което правя е, че вмъквам различни аргументи в скрипт на Python, който има синтаксис на аргументи, различен от скрипта bash. Причината да има котка е, че се опитвам да я направя така, че да може да чете и файлове. Скриптът на Python използва sys.arg за изпълнение на аргументи, този синтаксис е в кода. script.py извежда число.   -  person Caucasian Malaysian    schedule 19.05.2018
comment
Конкретиката има значение. Ако изпълните PS4=':$LINENO+' bash -x yourscript, за да регистрирате всеки ред, докато се изпълнява, и след това идентифицирате първия ред, където всеки тест се държи различно от това, което очаквате, това ще помогне много за опростяване на въпроса (изваждане на всичко, което не е свързано с този единствен ред ).   -  person Charles Duffy    schedule 19.05.2018


Отговори (1)


Използвайте case, (кодът ./script.py е пропуснат, за да покаже как работи логиката):

# Assumes none of the variables contain a '#' -- change to some other
# nonexistent string if needed.
case "$2#$3" in 
    "${VAR2}#${VAR3}") echo both ;;
    "${VAR2}#"*)       echo 1st ;;
    *"#${VAR3}")       echo 2nd ;;
    *)                echo none ;;
esac

Тъй като само две променливи се сравняват с два съответни низа, има само четири възможни резултата.

case приема няколко реда код, точно както if. Използвайки първото условие във въпроса, кодът ще стане:

case "$2#$3" in 
    "${VAR2}#${VAR3}") echo both ;;
    "${VAR2}#"*)       echo "I am condition number 1"
                     ./script.py "${VAR}" "$(<${VAR2}) ${VAR3}" ;;
    *"#${VAR3}")       echo 2nd ;;
    *)                echo none ;;
esac
person agc    schedule 18.05.2018
comment
Не сте обяснили защо кодът на OP не работи. И защо това е по-добро от верига if/elif/else? Сега има възможност за грешка, когато една от стойностите е подниз на другата. Умността си има цена. - person John Kugelman; 18.05.2018
comment
@JohnKugelman, Re когато една от стойностите е подниз на другата: Благодаря. Поправено сега. - person agc; 18.05.2018
comment
регистърът не изглежда да прави разлика, дори и с *, за да го промените, когато условията основно задават променливата на себе си. - person Caucasian Malaysian; 19.05.2018
comment
@CaucasianMalaysian, Въпросът остава твърде неясен по отношение на въвеждане и извеждане, за да се даде по-конкретен отговор. Но логическата част на въпроса е отговорна. Тук case е правилен и няма да направи нищо неочаквано, условният код е оставен на вас. (Заменете echo both и т.н. с който и да е подходящ код). - person agc; 19.05.2018