Я всегда стараюсь придерживаться 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
для чего-то серьезного - это слишком быстро нарушает требования реального мира (без лямбд, поэтому мы должны использовать строки. Но вложение вызовов функций со строками невозможно, каналы не возможны и т. Д.)