このBashスクリプトで "else"分岐(配列を巡回するループ)が実行されないのはなぜですか?

このBashスクリプトで "else"分岐(配列を巡回するループ)が実行されないのはなぜですか?

次のコード~/Downloads. ./script.sh。ユーザーが不完全な名前を送信しても、それを見つけます。

#!/usr/bin/bash

echo -e "\nGive me the name of a nonexitent directory and I will look for it in ~/Downloads?\n"

read word

TOGOs=("$(find ~/Downloads -maxdepth 1 -iname "*$word*" -type d -execdir echo {} + | sed 's;./;/home/smith/Downloads/;g')"
"")
for togo in ${TOGOs[@]}
do
  if [[ $togo != "" ]]; then
    echo $togo
    export togo && cd $togo && return 0
  else
    echo "Haven't found it in ~/Downloads ." && cd ~/Downloads #This line does not work
  fi
done

そのif部分は期待どおりに機能します。名前/サブディレクトリの一部の名前を指定した場合、存在しないディレクトリを指定した場合、ブロックの一部は実行されません~/Downloads/。ループから外れると、次のように実行された部分が得られます。elseelse

#!/usr/bin/bash

echo -e "\nGive me the name of a nonexitent directory and I will look for it in ~/Downloads?\n"

read word
TOGO=$(find ~/Downloads -maxdepth 1 -iname "*$word*" -type d -execdir echo {} + | sed 's;./;/home/smith/Downloads/;g')

if [[ $TOGO != "" ]]; then
  echo $TOGO
  export TOGO 
  cd $TOGO && return 0
else

  echo "Haven't found it in ~/Downloads." && cd ~/Downloads
fi

elseループから外れたときに腕が実行されるのはなぜですか?ループを維持しながらコードをどのように実行できますか?

答え1

${TOGOs[@]}配列の要素を取得し、空白(デフォルトとして仮定IFS)から別の単語に分割し、各単語をglobパターンとして解釈することを示します。$varすべての要素を順番に並べる点を除けば、スカラー変数と同じです。

配列に空の要素がある場合、分割ステップでその要素がゼロワードのリストに変わり、効果的に削除されます。

いつものように:変数とコマンドの置換には二重引用符を使用してください。わからない場合は除外する必要があります。配列要素をリストするには、正しい構文はです"${TOGOs[@]}"。配列アクセスは二重引用符を超えています。配列の各要素は別々の単語に配置されます。

ただし、正しい配列リスト構文を使用すると、配列の構成方法がわからないため役に立ちません。出力全体をfind単一の配列要素に入れます。このようにして出力を解析することはできませんfind。ファイル名の一部である改行とファイル名を区別するために使用される改行を区別する方法はありませんfind

出力を解析するのではなく、findbashで処理するか、find -exec …Bashに再帰的なワイルドカードを使用します(経由)。shopt -s globstar)必要があるが使用しているので、find -maxdepth 1実際には必要ではなく、find実際に役に立つことはありません。

shopt -s dotglob nullglob
TOGOs=(~/Downloads/*$word*/)
if [[ ${#TOGOs[@]} -eq 0 ]]; then
  echo "Haven't found it in ~/Downloads."
fi
for togo in "${TOGOs[@]}"; do
done

関連情報