Shell = ตรวจสอบว่าตัวแปรเริ่มต้นด้วย #


16

ฉันจะขอบคุณถ้าคุณสามารถช่วยฉันวิธีการคิดวิธีการตรวจสอบว่าเนื้อหาของตัวแปรเริ่มต้นด้วยเครื่องหมายแฮ:

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

สิ่งนี้ใช้ไม่ได้

ขอบคุณ!

Jans


1
ฉันจะพิจารณาความเป็นไปได้ที่อาจมีช่องว่างหน้าแท็กแฮชเช่นกันเมื่อทำการทดสอบสำหรับ "ความคิดเห็น" หากเป็นสิ่งที่คุณกำลังทำอยู่
rthomson

ในขณะที่คุณได้รับการยอมรับคำตอบที่เกี่ยวข้องกับการเป็นbashวิธีการแก้ปัญหาบางทีคุณอาจจะแก้ไขคำถามของคุณมันหมายถึงคุณกำลังต้องการหาsh/ dashวิธีการแก้ปัญหา
ชาร์ลส์โรแบร์โตคานาโต

ฉันขอแนะนำให้ใช้เส้นทางสัมบูรณ์ใน#!บรรทัดเนื่องจากเส้นทางสัมพัทธ์ในบรรทัดนั้นเห็นได้ชัดว่าสัมพันธ์กับไดเรกทอรีปัจจุบันของกระบวนการที่เรียกใช้สคริปต์แทนที่จะเกี่ยวข้องกับตำแหน่งของสคริปต์
kasperd

คำตอบ:


20

วิธีการดั้งเดิมของคุณจะทำงานได้ดีถ้าคุณหนีแฮช :

$ [[ '#snort' == \#* ]]; echo $?
0

อีกวิธีหนึ่งคือการตัดอักขระตัวแรกของเนื้อหาของตัวแปรออกมาโดยใช้ "Substring Expansion":

if [[ ${x:0:1} == '#' ]]
then
    echo 'yep'
else
    echo 'nope'
fi

yep

จากหน้า Bash man:

   ${parameter:offset}
   ${parameter:offset:length}
          Substring  Expansion.   Expands  to  up  to length characters of
          parameter starting at the character  specified  by  offset.   If
          length  is omitted, expands to the substring of parameter start-
          ing at the character specified by offset.  length and offset are
          arithmetic   expressions   (see  ARITHMETIC  EVALUATION  below).
          length must evaluate to a number greater than or equal to  zero.
          If  offset  evaluates  to  a number less than zero, the value is
          used as an offset from the end of the value  of  parameter.   If
          parameter  is  @,  the  result  is  length positional parameters
          beginning at offset.  If parameter is an array name indexed by @
          or  *,  the  result is the length members of the array beginning
          with ${parameter[offset]}.  A negative offset is taken  relative
          to  one  greater  than the maximum index of the specified array.
          Note that a negative offset must be separated from the colon  by
          at  least  one  space to avoid being confused with the :- expan-
          sion.  Substring indexing is zero-based  unless  the  positional
          parameters are used, in which case the indexing starts at 1.

หากต้องการดูหน้าคนนี้ฉันควรพิมพ์คนอะไร
duleshi

นี่คือหน้า Bash man ดังนั้น " man bash" ควรทำ
Insyte

2
นั่นคือการ bashism แต่แท็กเกี่ยวกับ "shell" ไม่ใช่ "bash" :(.
pevik

11

รุ่นที่รองรับ POSIX:

[ "${var%${var#?}}"x = '#x' ] && echo yes

หรือ:

[ "${var#\#}"x != "${var}x" ] && echo yes

หรือ:

case "$var" in
    \#*) echo yes ;;
    *) echo no ;;
esac

1
+1 สำหรับคำตอบ posix ในการทดสอบเวลาพื้นฐานบางcaseวิธีดูเหมือนจะเร็วที่สุดในสามตัวในคอมพิวเตอร์ x86 แบบ 32 บิตที่ค่อนข้างเก่า ทั้งสามเป็นไกลมีประสิทธิภาพมากขึ้นกว่าที่เป็นตัวอย่างง่ายๆที่ท่อหน่วยประมวลผล stdin echo $var | cut -c1ง่ามเช่น: การวิเคราะห์ของฉันค่อนข้างพื้นฐานจาก 10,000 ซ้ำในคอมพิวเตอร์ / os - YMMV เพียงเครื่องเดียว ฉันใช้คอมพิวเตอร์ที่ช้าลงเพื่อพูดเกินความแตกต่างและทำให้มองเห็นได้ชัดเจนขึ้น - อย่างน้อยบนแพลตฟอร์มเดียว
Juan

BTW สำหรับการทำซ้ำ 10,000,000 ครั้งวิธีการบิลด์อินที่อธิบายไว้ในคำตอบนี้ใช้เวลาประมาณหนึ่งนาที (ในกล่องช้าดังกล่าวข้างต้น) ท่อสู่cutรสชาติใช้เวลา 5+ ชั่วโมง
Juan

ถ้าคุณต้องการค้นหาสิ่งต่าง ๆ ที่ขึ้นต้นด้วย "
จัสติน

5

ฉันรู้ว่านี่อาจเป็นเรื่องนอกรีต แต่สำหรับสิ่งนี้ฉันควรใช้ grep หรือ egrep แทนที่จะทำจากภายในเชลล์ มันแพงกว่านิดหน่อย (ฉันเดา) แต่สำหรับฉันแล้วการแก้ปัญหานี้ของการอ่านจะลดราคาลง แน่นอนว่ามันเป็นเรื่องของรสนิยมส่วนตัว

ดังนั้น:

myvar="   #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
then
  echo "not a comment"
else
  echo "commented out"
fi

มันทำงานได้โดยมีหรือไม่มีช่องว่างนำ หากคุณต้องการบัญชีสำหรับแท็บนำด้วยให้ใช้ egrep -q '^ [\ t] * #' แทน


คิดเกี่ยวกับมันบางทีฉันแค่ชอบ egrep เพราะฉันชอบ regexes แต่ฉันคิดว่า grep / egrep จะเป็นประโยชน์ในการจัดสถานการณ์ที่กว้างขึ้นอย่างไรก็ตาม
Eduardo Ivanec

0

นี่เป็นอีกวิธีหนึ่ง ...

# assign to var the value of argument actual invocation
var=${1-"#default string"}

if [[ "$var" == "#"* ]]
then
  echo "$var starts with a #"
fi

เพียงแค่คัดลอกวางเนื้อหาไปยังไฟล์ให้สิทธิ์การดำเนินการและดูว่ามันทำงานอย่างไร;)

หวังว่ามันจะช่วย!

ทักทาย.


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