bash를 사용하여 문자열에 마침표가 있는지 테스트

bash를 사용하여 문자열에 마침표가 있는지 테스트

Drupal의 drush 명령줄 인터페이스 출력에서 ​​bash 명령을 실행하고 싶습니다. drush site-alias먼저 그룹 이름을 표시한 다음 그룹의 각 사이트를 표시하는 웹 루트 목록을 반환합니다. 웹사이트 자체는 별칭으로 되어 있습니다 group.site. 예를 들어, 다음과 같은 결과를 얻을 수 있습니다.

내부 내부.사이트1 내부.사이트2 외부 외부.사이트1 외부.사이트2 마케팅 마케팅.사이트1 마케팅.사이트2

그룹 별칭 자체가 아닌 각 사이트 별칭에서 명령을 실행하고 싶습니다. 문자열에 마침표가 있는지 테스트해야 하며, 그렇다면 다음을 실행하세요.

for i in $(drush site-alias); do {if no period) drush $i command; done;

이 테스트를 어떻게 실행할 수 있나요?

답변1

패턴 일치를 사용할 수 있습니다.

for i in $(drush site-alias) ; do
    if [[ $i == *.* ]] ; then
        drush "$i" command
    fi
done

답변2

$iPOSIX와 유사한 쉘의 경우 다음과 같은 경우 명령을 실행한다고 가정하십시오 .아니요예제에서 볼 수 있듯이 마침표를 포함하여 다음과 같이 작성할 수 있습니다.

case $i in
  (*.*) ;; # contains "."s, do nothing
  (*) drush "$i" command;;
esac

따옴표 가 $(drush site-alias)없으면 분할+glob이 수행됩니다. 원하는 분할은 $IFS기본적으로 문자(공백, 탭 및 줄 바꿈(zsh의 NUL 포함))에서 수행되는 반면, 원하지 않는 와일드카드는 단어 /*/.

GNU 시스템에서 GNU 쉘(bash)과 같은 Ksh 스타일 프로세스 교체를 지원하는 쉘을 사용하면 명령 출력이 다음과 같다고 가정합니다.사이트 별칭각 줄에 대해 다음을 수행할 수 있습니다.

xargs -rd '\n' -a <(drush site-alias | grep -vF .) -I@ drush @ command

여기에는 몇 가지 장점이 있습니다.

  • 와일드카드 없음
  • 무슨 일이 $IFS있어도 개행 문자와 개행 문자에서만 올바르게 분할됩니다.
  • 전체 출력을 메모리에 저장하지 말고 콘텐츠 출력이 시작 drush되는 즉시 명령을 실행하십시오.drush site-alias
  • 어느 하나라도 실패하면 해당 실패가 의 종료 상태 drush command에 반영됩니다 .xargs

모든 실패는 drush site-alias여전히 무시됩니다.

이를 통해 zsh다음을 수행할 수 있습니다.

autoload zargs
site_aliases=( ${(f)"$(drush site-alias)"} ) || exit
zargs -I@ -- ${site_aliases:#*.*} -- drush @ command

어디:

  • 또한 f매개변수 확장 플래그를 사용하여 개행에서만 분할합니다(빈 행은 삭제됩니다).
  • 실패를 처리합니다 drush site-alias(여기에서는 종료 스크립트를 통해).
  • ${site_aliases:#*.*}필터나가M( 필터에 매개변수 확장 플래그 추가존재하다대신) 요소가 포함되어 있습니다..
  • 마찬가지로 및 명령이 실패 xargs하면 zargs실패한 종료 상태가 반환됩니다.

답변3

패턴 교체 확장을 통해 이 작업을 수행할 수 있습니다.

for i in $(drush site-alias); do
  if [ -z "${i//[^.]/}" ]; then
     # no period
     drush "$i" command
  fi
done

예, 인용했습니다 "$i". 이것은 아마도 가능하다면 해야 할 일일 것입니다. 그렇게 하면 놀라움을 피할 수 있을 것입니다. 이 경우에는 중요하지 않습니다.

답변4

또 다른 독립적인 답변을 위해 다음을 사용하는 것이 좋습니다.쉘 매개변수 확장.

for i in $(drush site-alias)
do
    if [[ ${i%.*} == $i ]]
    then
        drush $i command
    fi
done

관련 정보