Làm cách nào để so sánh một biến với một chuỗi (và làm một cái gì đó nếu chúng khớp)?
Làm cách nào để so sánh một biến với một chuỗi (và làm một cái gì đó nếu chúng khớp)?
Câu trả lời:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Nếu bạn muốn làm gì đó khi chúng không khớp, hãy thay thế =
bằng !=
. Bạn có thể đọc thêm về các hoạt động chuỗi và hoạt động số học trong tài liệu tương ứng của họ.
$x
?Bạn muốn các trích dẫn xung quanh $x
, vì nếu nó trống, tập lệnh Bash của bạn gặp lỗi cú pháp như được thấy dưới đây:
if [ = "valid" ]; then
==
nhà điều hànhLưu ý rằng Bash cho phép ==
được sử dụng cho bình đẳng với [
, nhưng điều này không phải là tiêu chuẩn .
Sử dụng trường hợp đầu tiên trong đó các trích dẫn xung quanh $x
là tùy chọn:
if [[ "$x" == "valid" ]]; then
hoặc sử dụng trường hợp thứ hai:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Thay đổi điều này thành ["$ 1" = "on"] đã giải quyết vấn đề.
=
và không phải hai.
[ $x -eq "valid" ]
. -eq
là toán tử so sánh cho số nguyên, không phải chuỗi.
["x$yes" == "xyes"]
, đó là tiền tố cả biến và chuỗi ký tự bằng một x
? Đó có phải là một di tích của thời xưa hay nó thực sự cần thiết trong một số tình huống?
Hoặc, nếu bạn không cần mệnh đề khác:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
có thể thất bại.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
hiệu quả hơn ( echo invalid && false )
, vì nó tránh trả tiền cho một subshell không cần thiết.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Ghi chú:
if
và [
và ]
rất quan trọng>
và <
là các toán tử chuyển hướng để thoát nó với \>
và \<
tương ứng cho các chuỗi.$a
thực sự đã " "
bao quanh nó như là một phần của giá trị chuỗi ký tự, do đó tôi phải sử dụng ký tự thoát $b
để so sánh các giá trị. Tôi đã có thể tìm thấy điều này sau khi chạy bash -x ./script.sh
, cờ -x cho phép bạn xem giá trị của mỗi lần thực hiện và giúp gỡ lỗi.
Để so sánh chuỗi với ký tự đại diện, hãy sử dụng
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
xung quanh các ký tự đại diện. (btw: +1 cho ký tự đại diện!)
$stringB
phải được trích dẫn (và, tình cờ, phía bên trái không cần phải trích dẫn) : if [[ $stringA = *"$stringB"* ]]; then
.
Tôi phải không đồng ý một trong những ý kiến trong một điểm:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Có vẻ như nó giống như một, hmm, người không quen biết ...
Nó sử dụng các mẫu phổ biến như một ngôn ngữ, theo một cách nào đó;
Và sau khi bạn học ngôn ngữ.
Đó là một biểu thức logic đơn giản, với một phần đặc biệt: đánh giá lười biếng các toán tử logic.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Mỗi phần là một biểu thức logic; cái đầu tiên có thể đúng hoặc sai, hai cái còn lại luôn đúng.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Bây giờ, khi nó được đánh giá, đầu tiên được kiểm tra. Nếu nó sai, hơn toán hạng thứ hai của logic và &&
sau nó không liên quan. Điều đầu tiên là không đúng, vì vậy dù sao nó cũng không thể là lần đầu tiên và lần thứ hai là đúng.
Bây giờ, trong trường hợp này là mặt đầu tiên của logic hoặc ||
sai, nhưng nó có thể đúng nếu mặt kia - phần thứ ba - là đúng.
Vì vậy, phần thứ ba sẽ được đánh giá - chủ yếu là viết thông điệp như một tác dụng phụ. (Nó có kết quả0
đúng, mà chúng tôi không sử dụng ở đây)
Các trường hợp khác tương tự, nhưng đơn giản hơn - và - tôi hứa! là - có thể - dễ đọc!
(Tôi không có ai, nhưng tôi nghĩ việc trở thành cựu chiến binh UNIX với bộ râu xám sẽ giúp ích rất nhiều cho việc này.)
... && ... || ...
này thường cau mày (xin lỗi cựu chiến binh Unix, bạn đã sai trong suốt thời gian này), vì nó không tương đương về mặt ngữ nghĩa if ... then ... else ...
. Đừng lo lắng, đây là một cạm bẫy phổ biến .
... && ... || ...
là một mẫu hoàn toàn hợp lệ và một thành ngữ bash phổ biến. Việc sử dụng nó quy định kiến thức trước đó (có thể là điều tốt để ghi nhớ nếu có người mới bắt đầu), nhưng OP có mái tóc để chứng minh rằng họ biết cách tránh nắp hố ga mở.
bạn cũng có thể sử dụng case / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
, trước )
. Các in
tuyên bố là tương đương với then
trong if
báo cáo. Bạn có thể lập luận rằng nó hoạt động trên một danh sách các mẫu, trong đó mỗi danh sách có tuyên bố riêng về những việc cần làm, nếu bạn đến từ Python. Không thích substring in string
, nhưng đúng hơn for item in list
. Sử dụng *
như là tuyên bố cuối cùng của bạn nếu bạn muốn một else
điều kiện. Nó trở lại trong lần gặp đầu tiên.
Kịch bản sau đây đọc từ một tệp có tên "testonthis" theo từng dòng và sau đó so sánh mỗi dòng với một chuỗi đơn giản, một chuỗi với các ký tự đặc biệt và một biểu thức chính quy. Nếu nó không khớp, thì tập lệnh sẽ in dòng, nếu không thì không.
Không gian trong Bash rất quan trọng. Vì vậy, sau đây sẽ làm việc:
[ "$LINE" != "table_name" ]
Nhưng sau đây sẽ không:
["$LINE" != "table_name"]
Vì vậy, vui lòng sử dụng như là:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
nhưng [
thực ra là một nhị phân bên ngoài (như which [
mang lại kết quả tương tự /usr/bin/[
)
Tôi có thể sẽ sử dụng kết hợp regex nếu đầu vào chỉ có một vài mục hợp lệ. Ví dụ: chỉ "bắt đầu" và "dừng" là hành động hợp lệ.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Lưu ý rằng tôi viết thường biến $ACTION
bằng cách sử dụng dấu phẩy kép. Cũng lưu ý rằng điều này sẽ không hoạt động trên các phiên bản bash quá cũ ngoài kia.
Bash 4+ ví dụ. Lưu ý: không sử dụng dấu ngoặc kép sẽ gây ra vấn đề khi các từ có dấu cách, v.v. Luôn luôn trích dẫn trong Bash, IMO.
Dưới đây là một số ví dụ trong Bash 4+:
Ví dụ 1, kiểm tra 'có' trong chuỗi (không phân biệt chữ hoa chữ thường):
if [[ "${str,,}" == *"yes"* ]] ;then
Ví dụ 2, kiểm tra 'có' trong chuỗi (không phân biệt chữ hoa chữ thường):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Ví dụ 3, kiểm tra 'có' trong chuỗi (phân biệt chữ hoa chữ thường):
if [[ "${str}" == *"yes"* ]] ;then
Ví dụ 4, kiểm tra 'có' trong chuỗi (phân biệt chữ hoa chữ thường):
if [[ "${str}" =~ "yes" ]] ;then
Ví dụ 5, khớp chính xác (phân biệt chữ hoa chữ thường):
if [[ "${str}" == "yes" ]] ;then
Ví dụ 6, khớp chính xác (không phân biệt chữ hoa chữ thường):
if [[ "${str,,}" == "yes" ]] ;then
Ví dụ 7, khớp chính xác:
if [ "$a" = "$b" ] ;then
Thưởng thức.
if [ "$a"="$b" ]
hoặc nó không hoạt động ... không thể có khoảng trắng xung quanh bằng