Я всегда стараюсь придерживаться POSIX sh вместо использования расширений bash, поскольку одним из основных моментов написания сценариев является переносимость.(Помимо подключения программ, а не их замены)
В sh, есть простой способ проверить условие "is-prefix".
case $HOST in node*)
your code here
esac
Учитываясколько лет, тайный и грубый sh (а bash - не лекарство: он более сложный, менее последовательный и менее переносимый), я хотел бы отметить очень хороший функциональный аспект: хотя некоторые синтаксические элементы, такие как case
, созданы-в результате получаемые конструкции ничем не отличаются от любой другой работы.Они могут быть составлены таким же образом:
if case $HOST in node*) true;; *) false;; esac; then
your code here
fi
Или даже короче
if case $HOST in node*) ;; *) false;; esac; then
your code here
fi
Или даже короче (просто для представления !
в качестве элемента языка- но сейчас это плохой стиль)
if ! case $HOST in node*) false;; esac; then
your code here
fi
Если вам нравится быть явным, создайте свой собственный элемент языка:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Разве это не очень приятно?
if beginswith node "$HOST"; then
your code here
fi
И поскольку sh - это, в основном, только задания и списки строк (и внутренние процессы, из которых составляются задания), теперь мы можем даже выполнить небольшое функциональное программирование:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # prints TRUE
all "beginswith x" x xy abc ; checkresult # prints FALSE
ЭтоэлегантноНе то чтобы я рекомендовал использовать sh для чего-то серьезного - он слишком быстро нарушает требования реального мира (нет лямбда-выражений, поэтому нужно использовать строки. Но вложение вызовов функций со строками невозможно, каналы не возможны ...)