Có cách nào để làm một cái gì đó như thế này không
int a = (b == 5) ? c : d;
sử dụng Bash?
((...))
. Xem số học Shell .
$(( ))
số học và đánh giá số học (( ))
. Xem thêm https://mywiki.wooledge.org/ArithmeticExpression
.
Có cách nào để làm một cái gì đó như thế này không
int a = (b == 5) ? c : d;
sử dụng Bash?
((...))
. Xem số học Shell .
$(( ))
số học và đánh giá số học (( ))
. Xem thêm https://mywiki.wooledge.org/ArithmeticExpression
.
Câu trả lời:
toán tử ternary ? :
chỉ là hình thức ngắn củaif/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
Hoặc là
[[ $b = 5 ]] && a="$c" || a="$d"
=
toán tử kiểm tra sự bằng nhau của chuỗi, không phải là đẳng thức số (nghĩa [[ 05 = 5 ]]
là sai). Nếu bạn muốn so sánh số, sử dụng -eq
thay thế.
if/then/else
cond && op1 || op2
trúc có một lỗi cố hữu: nếu op1
có trạng thái thoát khác không vì bất kỳ lý do gì, kết quả sẽ âm thầm trở thành op2
. if cond; then op1; else op2; fi
là một dòng quá và không có khuyết điểm đó.
Mã số:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
là một lệnh bí danh, nhiều dòng (như echo 1; echo 2
), bạn nên đặt nó trong ngoặc đơn.
&&
sẽ không có một trạng thái thoát khác không. Nếu không, a && b || c
sẽ "bất ngờ" chạy c
nếu a
thành công nhưng b
thất bại.
Nếu điều kiện chỉ đơn thuần là kiểm tra xem một biến có được đặt hay không, thậm chí còn có dạng ngắn hơn:
a=${VAR:-20}
sẽ gán cho a
giá trị của VAR
if VAR
được đặt, nếu không nó sẽ gán cho nó giá trị mặc định 20
- đây cũng có thể là kết quả của một biểu thức.
Như alex ghi chú trong bình luận, cách tiếp cận này về mặt kỹ thuật được gọi là "Mở rộng tham số".
a=${1:-'my-hyphenated-text'}
:-
)
${VAR:-yes:-no}
.
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
Các cond && op1 || op2
biểu hiện gợi ý trong câu trả lời khác có lỗi cố hữu: nếu op1
có một trạng thái thoát khác không, op2
âm thầm trở thành kết quả; lỗi cũng sẽ không bị bắt trong -e
chế độ. Vì vậy, biểu hiện đó là chỉ an toàn để sử dụng nếu op1
không bao giờ có thể thất bại (ví dụ :
, true
nếu một dựng sẵn, hoặc gán biến mà không cần bất kỳ hoạt động mà có thể thất bại (như phân chia và gọi điện thoại OS)).
Lưu ý các ""
trích dẫn. Cặp đầu tiên sẽ ngăn lỗi cú pháp nếu $b
trống hoặc có khoảng trắng. Những người khác sẽ ngăn dịch tất cả các khoảng trắng thành các không gian duy nhất.
[ "x$b" -eq "x" ]
được sử dụng để kiểm tra chuỗi trống cụ thể. Tôi thích sử dụng các cú pháp được sử dụng bởi zsh ('MỞ RỘNG PARAMETER' trong trang web của zshExn) nhưng tôi không biết nhiều về tính di động của chúng.
(( a = b==5 ? c : d )) # string + numeric
(( ))
xử lý bất kỳ / tất cả các chuỗi như0
a=$(( b==5 ? c : d ))
[ $b == 5 ] && { a=$c; true; } || a=$d
Điều này sẽ tránh thực hiện phần sau | | một cách tình cờ khi mã giữa && và || thất bại
-e
chế độ: (set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
bulit-in thay vì true
lưu exec
-ing một chương trình bên ngoài.
&&
.. ||
và vẫn bắt được một lệnh thất bại ở giữa chúng không?
&&
và ||
theo định nghĩa áp dụng cho toàn bộ lệnh trước chúng. Vì vậy, nếu bạn có hai lệnh trước nó (bất kể chúng được kết hợp như thế nào), bạn không thể áp dụng nó cho chỉ một trong số chúng và không phải cho các lệnh khác. Bạn có thể mô phỏng if
/ then
/ else
logic với các biến cờ, nhưng tại sao phải bận tâm nếu có if
/ then
/ else
đúng?
Đây là một tùy chọn khác trong đó bạn chỉ phải xác định biến bạn đang gán một lần và không quan trọng việc gán của bạn là chuỗi hay số:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
Chỉ là một ý nghĩ. :)
[ test ]
. Vì vậy, cấu trúc chỉ an toàn để sử dụng nếu bạn "biết" rằng lệnh không xuất bất cứ thứ gì ra thiết bị xuất chuẩn.
VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.
Sau đây dường như hoạt động cho các trường hợp sử dụng của tôi:
$ tern 1 YES NO
YES
$ tern 0 YES NO
NO
$ tern 52 YES NO
YES
$ tern 52 YES NO 52
NO
và có thể được sử dụng trong một tập lệnh như vậy:
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
một phần của Bash? Mac dường như không có nó
chmod 700 tern
trong cùng một thư mục. Bây giờ bạn sẽ có một tern
lệnh trong thiết bị đầu cuối của mình
Chúng ta có thể sử dụng ba cách sau trong Shell Scripting cho toán tử ternary:
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
Ngoài ra còn có một cú pháp rất giống nhau cho các điều kiện ternary trong bash:
a=$(( b == 5 ? 123 : 321 ))
Thật không may, nó chỉ hoạt động với những con số - theo như tôi biết.
Bạn có thể sử dụng điều này nếu bạn muốn cú pháp tương tự
a=$(( $((b==5)) ? c : d ))
a=$(((b==5) ? : c : d))
- $((...))
chỉ cần thiết khi chúng ta muốn gán kết quả của số học cho một biến khác.
Dưới đây là một số tùy chọn:
1- Sử dụng nếu sau đó khác trong một dòng, nó là có thể.
if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi
2- Viết một hàm như thế này:
# 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
}
sử dụng kịch bản bên trong như thế này
result=`iif "$expr" 'yes' 'no'`
# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 is not true"`
3- Lấy cảm hứng trong câu trả lời trường hợp, cách sử dụng linh hoạt hơn và một dòng là:
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac
# Expression can be something like:
expr=`expr "$var1" '>' "$var2"`
Đây là một giải pháp chung, đó là
Kiểm tra với so sánh số
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Kiểm tra so sánh chuỗi
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
Điều này giống như câu trả lời tốt của Vladimir . Nếu "ternary" của bạn là trường hợp "nếu đúng, chuỗi, nếu sai, trống", thì bạn có thể chỉ cần làm:
$ 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
để trả lời: int a = (b == 5) ? c : d;
chỉ viết:
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
hãy nhớ rằng "biểu thức" tương đương với $ ((biểu thức))
bash
có một cái gì đó tương tự như "toán tử ternary" tuy nhiên trongbash
phần này được gọi là "toán tử điều kiện"expr?expr:expr
(xemman bash
phần goto "Đánh giá số học"). Hãy nhớ rằngbash
"toán tử có điều kiện" là khó khăn và có một số vấn đề.