Я был бы признателен, если бы вы помогли мне выяснить, как определить, начинается ли содержимое переменной со знака решетки:
#!bin/sh
myvar="#comment asfasfasdf"
if [ myvar = #* ]
это не работает.
Спасибо!
Янс
Ваш оригинальный подход будет работать нормально, если вы сбежал из хеша:
$ [[ '#snort' == \#* ]]; echo $?
0
Другой подход заключался бы в вырезании первого символа содержимого переменной с помощью «Substring Expansion»:
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.
POSIX-совместимая версия:
[ "${var%${var#?}}"x = '#x' ] && echo yes
или:
[ "${var#\#}"x != "${var}x" ] && echo yes
или:
case "$var" in
\#*) echo yes ;;
*) echo no ;;
esac
Я знаю, что это может быть ересью, но для такого рода вещей я бы предпочел использовать grep или egrep, а не делать это из оболочки. Это немного дороже (я думаю), но для меня читабельность этого решения компенсирует это. Хотя это, конечно, дело личного вкуса.
Так:
myvar=" #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
then
echo "not a comment"
else
echo "commented out"
fi
Он работает с пробелами в начале или без них. Если вы хотите также учитывать ведущие вкладки, используйте вместо них egrep -q '^ [\ t] * #'.
Вот еще способ ...
# assign to var the value of argument actual invocation
var=${1-"#default string"}
if [[ "$var" == "#"* ]]
then
echo "$var starts with a #"
fi
Просто скопируйте и вставьте содержимое в файл, предоставьте разрешения на выполнение и посмотрите, как это работает;).
Надеюсь, поможет!
Приветствую.