ตรวจสอบว่าสตริงไม่ว่างหรือเว้นวรรคในเชลล์สคริปต์หรือไม่


94

ฉันกำลังพยายามรันเชลล์สคริปต์ต่อไปนี้ซึ่งควรจะตรวจสอบว่าสตริงไม่มีช่องว่างหรือว่างเปล่า อย่างไรก็ตามฉันได้รับเอาต์พุตเดียวกันสำหรับทั้ง 3 สตริงที่กล่าวถึง ฉันได้ลองใช้ไวยากรณ์ "[[" แล้ว แต่ก็ไม่มีประโยชน์

นี่คือรหัสของฉัน:

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

ฉันได้รับผลลัพธ์ต่อไปนี้:

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

สตริงว่างเรียกว่าสตริงว่างในเชลล์สคริปต์หรือไม่
Josiah Yoder

คำตอบ:


126

คุณต้องมีช่องว่างด้านใดด้านหนึ่งของไฟล์!=. เปลี่ยนรหัสของคุณเป็น:

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

ขอบคุณมากมันได้ผล แต่ฉันสงสัยว่าทำไมงานถึงไม่ใช้ช่องว่างในขณะที่การเปรียบเทียบทำ
Shubhanshu Mishra

5
^^ มันคือไวยากรณ์ คำแรกในบรรทัดคำสั่งคือคำสั่งและคำที่ตามมาคืออาร์กิวเมนต์ var=value [command [args]]คือไวยากรณ์ซึ่งมีการกำหนดค่าตัวแปร สำหรับการเปรียบเทียบ[( /usr/bin/[) คือคำสั่งและต้องใช้ var1,! = & var2 เป็น 3 อาร์กิวเมนต์แยกกัน var1! = var2 เป็นอาร์กิวเมนต์เดียว
anishsane

64

สำหรับการตรวจสอบสตริงว่างในเชลล์

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

หรือ

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

10
=ผู้ประกอบการสตริงความเท่าเทียมกันของเปลือกเป็น ==เป็นสับไม่ใช่แบบพกพาที่คิดค้นโดยนักเขียนเปลือกจะเลอะจิตใจของโปรแกรมเมอร์หนุ่ม
Jens

18

ในกรณีที่คุณต้องการตรวจสอบกับช่องว่างใด ๆ ไม่ใช่แค่ช่องว่างเดียวคุณสามารถทำได้:

ในการตัดสตริงของช่องว่างสีขาวพิเศษ (รวมถึงช่องว่างตรงกลางถึงหนึ่งช่องว่าง):

trimmed=`echo -- $original`

--เพื่อให้แน่ใจว่าถ้า$originalมีสวิทช์ที่เข้าใจกันโดยก้องพวกเขาจะยังคงได้รับการพิจารณาเป็นข้อโต้แย้งปกติที่จะสะท้อน นอกจากนี้สิ่งสำคัญคืออย่าวางไว้""รอบ ๆ$originalมิฉะนั้นช่องว่างจะไม่ถูกลบออก

หลังจากนั้นคุณสามารถตรวจสอบว่า$trimmedว่างหรือไม่

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

3
ในเปลือกหอยฉันลงท้ายด้วย "-" เป็นค่าของการตัดแต่ง
Sridhar Sarnobat

ตามโพสต์นี้ echo ไม่ได้ตีความ - หมายถึงการสิ้นสุดของตัวเลือก ในทุบตีเปลือกของฉันฉันได้รับผลเช่นเดียวกับ Sridhar Sarnobat
Mr.C

10

การทดสอบอย่างรวดเร็วอีกอย่างหนึ่งสำหรับสตริงที่มีบางสิ่งอยู่ในนั้น แต่มีช่องว่าง

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

"-n" หมายถึงสตริงที่มีความยาวไม่เป็นศูนย์

จากนั้นเครื่องหมายทับสองตัวแรกหมายถึงตรงกับสิ่งต่อไปนี้ทั้งหมดในช่องว่างกรณีของเรา จากนั้นเครื่องหมายทับที่สามตามด้วยสตริงแทนที่ (ว่าง) และปิดด้วย "}" สังเกตความแตกต่างจากไวยากรณ์ของนิพจน์ทั่วไป

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการจัดการสตริงในเปลือกทุบตีสคริปต์ที่นี่


ไม่[[ -n "$1" ]]เหมือนกับ[[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills คุณพูดถูกการใช้ -n จะทำให้สั้นลงเล็กน้อย ฉันเพิ่งอัปเดตคำตอบตามนั้น
elomage

6

หากต้องการตรวจสอบว่าสตริงว่างเปล่าหรือมีเพียงช่องว่างคุณสามารถใช้:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

ดูการขยายพารามิเตอร์เชลล์และการจับคู่รูปแบบในคู่มือ Bash


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

การตัดบรรทัดใหม่และช่องว่างทั้งหมดออกจากสตริงจะทำให้ค่าว่างถูกลดลงจนไม่มีอะไรสามารถทดสอบและดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.