bashを使用して文字列にピリオドがあるかどうかをテストする

bashを使用して文字列にピリオドがあるかどうかをテストする

Drupalのdrushコマンドラインインタフェース出力からbashコマンドを実行したいと思います。drush site-aliasまず、グループ名を表示してから、グループ内の各サイトを表示するWebルートのリストを返します。ウェブサイト自体はエイリアスになっています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シェルのような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(フィルタにパラメータ拡張フラグを追加する存在する代わりに)要素が含まれています。.
  • 同様に、コマンドが失敗するxargszargs失敗した終了ステータスが返されます。

答え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

関連情報