Shell = Перевірте, чи починається змінна з #


16

я буду вдячний, якщо ви могли б допомогти мені розібратися, як визначити, чи починається вміст змінної зі знака хеша:

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

це не працює.

Спасибі!

Янс


1
Я б розглядав можливість того, що перед тестом хешу можуть бути пробіли і під час тестування на "коментарі", якщо це дійсно те, що ви робите.
rthomson

Коли ви прийняли відповідь, яка передбачає bashрішення, можливо, ви могли б відредагувати своє запитання, оскільки це означає, що ви бажаєте отримати sh/ dashрішення.
Чарльз Роберто Канато

Я рекомендую використовувати абсолютний шлях у #!рядку як відносний шлях у цьому рядку, мабуть, взято відносно поточного каталогу процесу, що виконує сценарій, а не щодо місця, де знаходиться сценарій.
kasperd

Відповіді:


20

Ваш оригінальний підхід спрацював би чудово, якби ви уникнули хешу :

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

Іншим підходом було б відсікання вмісту першого символу змінної версії за допомогою "Розширення підрядків":

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

yep

На сторінці чоловіка 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.

Щоб побачити цю чоловічу сторінку, я мушу набрати man що?
дулеші

Це сторінка Bash man, тому " man bash" повинна це зробити.
Insyte

2
Це башізм, але тег про "оболонку", а не "баш" :(.
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 для відповіді на пози. У деяких тестах рудиментарних хронометрів, caseздається , цей метод є найшвидшим із трьох на досить старому 32-бітному комп'ютері x86. Всі три є набагато більш ефективним , ніж простий приклад , який труба з роздвоєним стандартним вводом процесора , як: echo $var | cut -c1. Мій аналіз був досить базовим на основі 10 000 000 ітерацій лише на одному комп'ютері / OS - YMMV. Я просто використовував цей повільніше комп'ютер, щоб перебільшувати будь-які відмінності та зробити їх більш помітними - принаймні на цій платформі.
Хуан

До цих пір, за ці 10 000 000 ітерацій, вбудовані методи, описані у цій відповіді, пробігли приблизно за хвилину (на згаданому повільному полі). Труба для cutароматизації зайняла 5+ годин.
Хуан

Що робити, якщо ви хочете знайти речі, починаючи з "
Justin

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, тому що мені подобаються регулярні вирази, але я вважаю, що grep / egrep є корисним у більш широкому розташуванні ситуацій.
Едуардо Іванець

0

Ось ще один спосіб ...

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

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

Просто скопіюйте вставте вміст у файл, надайте дозволи на виконання та подивіться, як він просто працює;).

Сподіваюся, це допомагає!

Привітання.


1
Це башізм, але тег про "оболонку", а не "баш" :(.
pevik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.