Shell = Değişkenin # ile başlayıp başlamadığını kontrol edin


16

bana nasıl anlamaya yardımcı olabilir, bir değişkenin içeriği karma işareti ile başlar olmadığını belirlemek için nasıl minnettar olacaktır:

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

bu çalışmıyor.

Teşekkürler!

Jans


1
Gerçekten yaptığınız buysa, "yorumlar" için test yaparken de karma etiketinden önce boşluk olması olasılığını düşünürdüm .
rthomson

Bir bashçözümü içeren bir cevabı kabul ettiğiniz için, sorunuzu düzenleyebilirsiniz, çünkü bu bir sh/ dashçözüm için istediğinizi ima eder .
Charles Roberto Canato

Bu #!satırda göreli bir yol olarak satırda mutlak bir yol kullanmanızı öneririm görünüşe göre komut dosyası bulunduğu yere göre komut dosyası yürütme işleminin geçerli dizinine göre alınır.
kasperd

Yanıtlar:


20

Eğer Özgün yaklaşım sadece para cezası çalışacak karma kaçtı :

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

Başka bir yaklaşım, değişkenin içeriğinin ilk karakterini "Alt Dizgi Genişletmesi" kullanarak dilimlemek olacaktır:

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

yep

Bash man sayfasından:

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

Bu adam sayfasını görmek için man ne yazmalıyım?
duleshi

Bu Bash man sayfası, bu yüzden " man bash" yapmalı.
Mart'ta Insyte

2
Bu bashizm, ama etiketi "bash" değil "shell" ile ilgilidir :(.
pevik

11

POSIX uyumlu sürüm:

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

veya:

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

veya:

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

1
Posix yanıtı için +1. Bazı temel zamanlama testlerinde, caseyöntem oldukça eski bir 32 bit x86 bilgisayardaki üçün en hızlısı gibi görünüyor. Üç olan çok daha etkili, basit bir örnek daha gibi çatallı Stdin işlemciye olan borular: echo $var | cut -c1. Analizim sadece bir bilgisayar / işletim sistemi olan YMMV'deki 10.000.000 yinelemeye dayanarak oldukça basitti. Bu yavaş bilgisayarı, farkları abartmak ve daha görünür hale getirmek için kullandım - en azından bu platformda.
Juan

BTW, bu 10.000.000 yineleme için, bu cevapta açıklanan yerleşik yöntemler yaklaşık bir dakika içinde (yukarıda belirtilen yavaş kutuda) koştu. Tatlandırmak için boru cut5+ saat sürdü.
Juan

""
Justin

5

Bunun sapkınlık olabileceğini biliyorum, ama bu tür şeyler için kabuğun içinden yapmak yerine grep veya egrep kullanmayı tercih ederim. Biraz daha pahalı (sanırım) ama benim için bu çözümün okunabilirliği bunu dengeliyor. Tabii ki bu kişisel bir zevk meselesi.

Yani:

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

Önde gelen boşluklu veya boşluksuz olarak çalışır. Önde gelen sekmeleri de hesaba katmak istiyorsanız, bunun yerine egrep -q '^ [\ t] * #' kullanın.


Bunu düşünmek belki sadece egrep'i tercih ediyorum çünkü regexes'i seviyorum, ancak grep / egrep'in zaten daha geniş bir durum düzenlemesinde yararlı olduğunu düşünüyorum.
Eduardo Ivanec

0

İşte başka bir yol ...

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

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

Sadece içeriği bir dosyaya yapıştırın, yürütme izinleri verin ve nasıl çalıştığını izleyin;).

Umarım yardımcı olur!

Selamlar.


1
Bu bashizm, ama etiketi "bash" değil "shell" ile ilgilidir :(.
pevik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.