Shell = Periksa apakah variabel dimulai dengan #


16

saya akan berterima kasih jika Anda bisa membantu saya cara mencari tahu, cara menentukan apakah konten variabel dimulai dengan tanda pagar:

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

ini tidak bekerja.

Terima kasih!

Jans


1
Saya akan mempertimbangkan kemungkinan bahwa mungkin ada spasi sebelum tag hash juga saat menguji "komentar", jika memang itu yang Anda lakukan.
rthomson

Ketika Anda menerima jawaban yang melibatkan bashsolusi, mungkin Anda bisa mengedit pertanyaan Anda, karena menyiratkan Anda berharap untuk sh/ dashsolusi.
Charles Roberto Canato

Saya sarankan menggunakan jalur absolut di #!baris sebagai jalur relatif di baris yang tampaknya diambil relatif ke direktori saat ini dari proses menjalankan skrip daripada relatif di mana skrip berada.
kasperd

Jawaban:


20

Pendekatan awal Anda akan bekerja dengan baik jika Anda lolos dari hash :

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

Pendekatan lain akan memotong karakter pertama dari konten variabel, menggunakan "Substring Expansion":

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

yep

Dari halaman manual Bash:

   ${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.

Untuk melihat halaman manual ini, saya harus mengetikkan apa?
duleshi

Itu halaman manual Bash, jadi " man bash" harus melakukannya.
Insyte

2
Itu bashism, tapi tag tentang "shell" bukan "bash" :(.
pevik

11

Versi yang kompatibel dengan POSIX:

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

atau:

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

atau:

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

1
+1 untuk jawaban posix. Dalam beberapa tes timing yang belum sempurna, casemetode ini tampaknya menjadi yang tercepat dari ketiganya pada komputer x86 32-bit yang cukup lama. Ketiganya adalah jauh lebih efisien daripada contoh sederhana yang pipa untuk prosesor stdin bercabang seperti: echo $var | cut -c1. Analisis saya cukup mendasar berdasarkan 10.000.000 iterasi hanya pada satu komputer / os - YMMV. Saya hanya menggunakan komputer yang lebih lambat untuk melebih-lebihkan perbedaan dan membuatnya lebih terlihat - setidaknya pada satu platform itu.
Juan

BTW, untuk 10.000.000 iterasi, metode builtin yang dijelaskan dalam jawaban ini berjalan sekitar satu menit (pada kotak lambat yang disebutkan di atas). Pipa untuk cutrasa butuh waktu 5+ jam.
Juan

Bagaimana jika Anda ingin menemukan hal-hal yang dimulai dengan "
Justin

5

Saya tahu ini mungkin bid'ah, tetapi untuk hal-hal seperti ini saya lebih suka menggunakan grep atau egrep daripada melakukannya dari dalam shell. Ini sedikit lebih mahal (saya kira) tetapi bagi saya pembacaan solusi ini mengimbangi itu. Ini masalah selera pribadi, tentu saja.

Begitu:

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

Ini bekerja dengan atau tanpa spasi terkemuka. Jika Anda juga ingin membuat tab terkemuka, gunakan egrep -q '^ [\ t] * #'.


Kalau dipikir-pikir, mungkin saya lebih suka egrep karena saya suka regex, tapi saya menganggap grep / egrep berguna dalam pengaturan situasi yang lebih luas.
Eduardo Ivanec

0

Ini cara lain ...

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

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

Cukup salin tempel konten ke file, berikan izin eksekusi, dan lihat cara kerjanya;).

Semoga ini bisa membantu!

Salam pembuka.


1
Itu bashism, tapi tag tentang "shell" bukan "bash" :(.
pevik
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.