Я завжди намагаюся дотримуватися POSIX sh
замість того, щоб використовувати розширення Bash, оскільки одним із головних моментів сценаріїв є портативність (окрім підключення програм, а не їх заміни).
У sh
, існує простий спосіб перевірити стан "є префіксом".
case $HOST in node*)
# Your code here
esac
З огляду на те, скільки років має таємничий та нахабний шум (а 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
для чогось серйозного - це надто швидко розбивається на вимоги реального світу (немає лямбда, тому ми повинні використовувати рядки. Але виклик функції введення рядками не можливий, труби неможливі тощо)