Чи є спосіб зробити щось подібне
int a = (b == 5) ? c : d;
використовуючи Bash?
((...))
. Дивіться арифметику оболонки .
$(( ))
та арифметичною оцінкою (( ))
. Дивіться також https://mywiki.wooledge.org/ArithmeticExpression
.
Чи є спосіб зробити щось подібне
int a = (b == 5) ? c : d;
використовуючи Bash?
((...))
. Дивіться арифметику оболонки .
$(( ))
та арифметичною оцінкою (( ))
. Дивіться також https://mywiki.wooledge.org/ArithmeticExpression
.
Відповіді:
потрійний оператор ? :
- це просто коротка формаif/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
Або
[[ $b = 5 ]] && a="$c" || a="$d"
=
оператор перевіряє рівність рядків, а не числову рівність (тобто [[ 05 = 5 ]]
хибність). Якщо ви хочете числове порівняння, використовуйте -eq
замість цього.
if/then/else
cond && op1 || op2
конструкції є притаманна помилка: якщо op1
з будь-якої причини є ненульовий статус виходу, результат тихо стане op2
. if cond; then op1; else op2; fi
також є одна лінія і не має цього дефекту.
Код:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
- це псевдонімна, багаторядкова команда (наприклад echo 1; echo 2
), вам слід укласти її в дужки.
&&
не матиме статус нульового виходу. В іншому випадку a && b || c
буде "несподівано" працювати, c
якщо a
вдасться, але b
не вдасться.
Якщо умова лише перевіряє, чи встановлена змінна, існує ще коротша форма:
a=${VAR:-20}
призначить a
значення VAR
if, якщо VAR
воно встановлено, інакше воно призначить йому значення за замовчуванням 20
- це також може бути результатом вираження.
Як зазначає Алекс у коментарі, такий підхід технічно називається "Розширення параметрів".
a=${1:-'my-hyphenated-text'}
:-
)
${VAR:-yes:-no}
.
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
cond && op1 || op2
Вираз пропонується в інших відповідях має властиву помилку: якщо op1
має ненульовий статус завершення, op2
мовчки стає результатом; помилка також не потрапить у -e
режим. Таким чином, цей вислів тільки безпечно використовувати , якщо op1
не може потерпіти невдачу (наприклад, :
, true
якщо вбудовані ним , або надання значення змінних без будь - яких операцій , які можуть не (як поділ і виклики ОС)).
Зверніть увагу на ""
цитати. Перша пара запобіжить помилку синтаксису, якщо $b
вона порожня або має пробіли. Інші заважають перекладати весь пробіл в єдині пробіли.
[ "x$b" -eq "x" ]
використовується для тестування порожнього рядка конкретно. Мені подобається використовувати синтаксиси, які використовує zsh ("ПАРАМЕТРОВЕ РОЗШИРЕННЯ" на сторінці zshexpn), але я не знаю багато про їх переносимість.
(( a = b==5 ? c : d )) # string + numeric
(( ))
трактує будь-які / всі рядки як0
a=$(( b==5 ? c : d ))
[ $b == 5 ] && { a=$c; true; } || a=$d
Це дозволить уникнути виконання частини після || випадково, коли код між && та || не вдається.
-e
(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
success 0 further on
:
bulit-in замість true
збереження-збереження exec
зовнішньої програми.
&&
.. ||
і все-таки спіймати невдалу команду між ними?
&&
і ||
за визначенням застосовується до всієї команди перед ними. Отже, якщо перед вами є дві команди (незалежно від того, як вони поєднуються), ви не можете застосувати її лише до однієї з них, а не до іншої. Ви можете імітувати if
/ then
/ else
логіку змінними прапора, але навіщо турбуватися, якщо є if
/ then
/ else
належним?
Ось ще один варіант, коли вам потрібно лише один раз вказати змінну, яку ви присвоюєте, і не має значення, яка ваша присвоєння - це рядок чи число:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
Просто думка. :)
[ test ]
. Таким чином, конструкція безпечна для використання, лише якщо ви "знаєте", що команда нічого не видає для stdout.
VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.
Для моїх випадків використання, здається, працює:
$ tern 1 YES NO
YES
$ tern 0 YES NO
NO
$ tern 52 YES NO
YES
$ tern 52 YES NO 52
NO
і може бути використаний у такому сценарії:
RESULT=$(tern 1 YES NO)
echo "The result is $RESULT"
function show_help()
{
echo ""
echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}"
echo ""
echo "e.g. "
echo ""
echo "tern 1 YES NO => YES"
echo "tern 0 YES NO => NO"
echo "tern "" YES NO => NO"
echo "tern "ANY STRING THAT ISNT 1" YES NO => NO"
echo "ME=$(tern 0 YES NO) => ME contains NO"
echo ""
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$3" ]
then
show_help
fi
# Set a default value for what is "false" -> 0
FALSE_VALUE=${4:-0}
function main
{
if [ "$1" == "$FALSE_VALUE" ]; then
echo $3
exit;
fi;
echo $2
}
main "$1" "$2" "$3"
tern
частиною Bash?
chmod 700 tern
у тій же папці. Тепер у вас буде tern
команда у своєму терміналі
У програмі Shell Scripting для потрійного оператора ми можемо використовувати наступні три способи:
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
У башті також є дуже подібний синтаксис для потрійних умовних умов:
a=$(( b == 5 ? 123 : 321 ))
На жаль, він працює лише з цифрами - наскільки я знаю.
Ви можете використовувати це, якщо хочете схожий синтаксис
a=$(( $((b==5)) ? c : d ))
a=$(((b==5) ? : c : d))
- $((...))
потрібен лише тоді, коли ми хочемо віднести результат арифметики до іншої змінної.
Ось кілька варіантів:
1- Використовуйте, якщо тоді ще в одному рядку, можливо.
if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi
2- Напишіть функцію, як це:
# Once upon a time, there was an 'iif' function in MS VB ...
function iif(){
# Echoes $2 if 1,banana,true,etc and $3 if false,null,0,''
case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}
використовувати всередині сценарію, як це
result=`iif "$expr" 'yes' 'no'`
# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 is not true"`
3- Натхненний відповіддю у справі, більш гнучким та використанням одного рядка є:
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac
# Expression can be something like:
expr=`expr "$var1" '>' "$var2"`
Ось загальне рішення, це
Тест з числовим порівнянням
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Тест зі порівнянням рядків
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
Це дуже схоже на прекрасну відповідь Володимира . Якщо ваш "потрійний" - це випадок "if true, string, якщо false, порожній", ви можете просто зробити:
$ c="it was five"
$ b=3
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
$ b=5
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
it was five
відповісти на: int a = (b == 5) ? c : d;
просто напишіть:
b=5
c=1
d=2
let a="(b==5)?c:d"
echo $a # 1
b=6;
c=1;
d=2;
let a="(b==5)?c:d"
echo $a # 2
пам'ятайте, що "вираз" еквівалентний $ ((вираз))
bash
має щось подібне до "потрійного оператора", проте вbash
цьому це називається "умовний оператор"expr?expr:expr
(див.man bash
перехідний розділ "Арифметична оцінка"). Майте на увазі, щоbash
"умовний оператор" є хитрим і має деякі добутки.