sh
스크립팅의 주요 포인트 중 하나는 이식성 ( 프로그램을 바꾸는 것이 아니라 연결 하는 것 외에)이기 때문에 항상 Bash 확장을 사용하는 대신 POSIX를 고수하려고 노력합니다 .
에서 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
진지한 것을 사용하여 옹호하지는 않습니다 . 실제 요구 사항에서 너무 빨리 깨집니다 (람다가 없으므로 문자열을 사용해야합니다. 그러나 문자열로 중첩 함수 호출은 불가능하며 파이프는 불가능합니다)