Kiểm tra xem chuỗi không trống hoặc không có khoảng cách trong tập lệnh shell


92

Tôi đang cố gắng chạy tập lệnh shell sau đây được cho là để kiểm tra xem một chuỗi không phải là khoảng trắng hay trống hay không. Tuy nhiên, tôi nhận được cùng một đầu ra cho tất cả 3 chuỗi được đề cập. Tôi cũng đã thử sử dụng cú pháp "[[" nhưng vô ích.

Đây là mã của tôi:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

Tôi nhận được kết quả sau:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

Các chuỗi rỗng có được gọi là chuỗi null trong kịch bản shell không?
Josiah Yoder

Câu trả lời:


123

Bạn cần một khoảng trống ở hai bên của !=. Thay đổi mã của bạn thành:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

Cảm ơn rất nhiều, nó hoạt động. Nhưng tôi tự hỏi tại sao bài tập không sử dụng dấu cách trong khi phép so sánh thì có.
Shubhanshu Mishra

5
^^ Đó là cú pháp. Từ đầu tiên trên dòng lệnh là lệnh và các từ tiếp theo là đối số. var=value [command [args]]là cú pháp, trong đó một biến được gán giá trị. để so sánh, [( /usr/bin/[) là lệnh & nó yêu cầu var1,! = & var2 là 3 đối số riêng biệt. var1! = var2 là một đối số duy nhất.
anishsane

62

Để kiểm tra chuỗi trống trong shell

if [ "$str" == "" ];then
   echo NULL
fi

HOẶC LÀ

if [ ! "$str" ];then
   echo NULL
fi

9
Toán tử bình đẳng chuỗi của shell là =. Đây ==là một cách hack không di động được phát minh bởi các tác giả shell để làm rối loạn tâm trí của các lập trình viên trẻ.
Jens

17

Trong trường hợp bạn cần kiểm tra bất kỳ khoảng trắng nào, không chỉ một khoảng trắng, bạn có thể thực hiện điều này:

Để loại bỏ chuỗi khoảng trắng thừa (cũng chia khoảng trắng ở giữa thành một khoảng trắng):

trimmed=`echo -- $original`

Điều này --đảm bảo rằng nếu $originalchứa các công tắc được hiểu bởi echo, chúng sẽ vẫn được coi là các đối số bình thường được lặp lại. Ngoài ra, điều quan trọng là không đặt ""xung quanh $original, nếu không các khoảng trống sẽ không bị loại bỏ.

Sau đó, bạn chỉ cần kiểm tra xem $trimmedcó trống không.

[ -z "$trimmed" ] && echo "empty!"

3
Trong bourne shell, tôi kết thúc bằng "-" là giá trị của trimmed.
Sridhar Sarnobat

Theo bài đăng này , tiếng vang không diễn giải - có nghĩa là sự kết thúc của các lựa chọn. Trong Bash shell của tôi, tôi nhận được kết quả tương tự như Sridhar Sarnobat
Mr.C

9

Một thử nghiệm nhanh khác cho một chuỗi để có một cái gì đó trong đó nhưng không gian.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" có nghĩa là chuỗi độ dài khác 0.

Sau đó, hai dấu gạch chéo đầu tiên có nghĩa là khớp với tất cả những điều sau đây, trong (các) khoảng trắng trường hợp của chúng ta. Sau đó, dấu gạch chéo thứ ba được theo sau bằng chuỗi thay thế (trống) và được đóng bằng "}". Lưu ý sự khác biệt so với cú pháp biểu thức chính quy thông thường.

Bạn có thể đọc thêm về thao tác chuỗi trong kịch bản bash shell tại đây .


không [[ -n "$1" ]]giống với [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills bạn nói đúng, sử dụng -n sẽ làm cho nó ngắn hơn một chút. Tôi chỉ cập nhật câu trả lời cho phù hợp.
elomage


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

Việc loại bỏ tất cả các dòng mới và khoảng trắng khỏi chuỗi sẽ làm cho một dòng trống bị giảm xuống thành không có gì có thể được kiểm tra và xử lý

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.