Bashでの配列値の処理

Bashでの配列値の処理

ファイル名に基づいて配列を作成しようとしていますが、スペースに問題があります。これは非常に一般的なようです。しかし、私が知っている限り、引用符は正しく設定され、配列がどのように構成されているかを推測します。

to_dump="$(find . -maxdepth 1 -print0 )"
to_dump_array=($to_dump)

read -p " ->  " final
case "$final" in
   a) for drop in "${to_dump_array[@]}" ;
      do cp "$drop" --recursive --force Destination_Folder && \
      echo "dropped \"$drop\" ;
      done ;;
   b) echo "Won't drop anything" ;;
esac

クエリクエリで配列を作成するより良い方法があるべきだと思います。また、私はまたどこに間違っていますか?

ベストアンサー1

-print0$(...)bash変数の文字列はnullで終わるため、置換に使用しないでください。

私はこの質問が尋ねるのと同じ答えで質問しました。https://stackoverflow.com/a/30469553/1091693

次の答えをあなたの質問に合わせて調整してください。

to_dump=()
while IFS= read -r -d ''; do
  to_dump+=( "$REPLY" )
done < <(find . -maxdepth 1 -print0)

その後、名前付き配列が作成され、to_dumpこのreadコマンドを使用して配列からNULLで区切られた要素を読み取りますfind。ここでパイプの代わりに使用する理由は、< <(...)配列が変更されるのを防ぐ暗黙的なサブシェルを避けるためです。

元のfindコマンドに1つが必要な場合-mindepth 1や、.再帰的にコピーする(現在のディレクトリ)を選択することができることは注目に値します。


私は-maxdepth 1findのための引数として使用したことがわかりました。おそらくこれはもっと役に立つでしょう:

shopt -s nullglob
to_dump=( * .[!.]* ..?* )

避けてくださいfind。これはbash組み込みのみを使用し、フォークせず、ほとんど非常にきれいです。

最初の行shopt -s nullglobは、このオプションを有効にするbash(-only)コマンドですnullglob。オプションは以下に説明されていますman 1 bash

設定されている場合、bashは、どのファイルとも一致しないパターン(上記のパス名の拡張を参照)を、自分ではなく空の文字列に拡張することを許可します。

簡単に言えば、入力したファイルが*ファイルと一致しない場合は削除されます*。デフォルトの動作は*、とにかくそのファイルを置くことです。

2行目は配列に3つの球を追加します。

  • *: 次から始まらないすべてのファイル.
  • .[!.]*.:1つと1つの非文字で始まるすべてのファイル.。これは一致.やディレクトリを避けるためです..
  • ..?*..: 1 つ以上の文字で始まるすべてのファイルです。これを追加する理由は前のglobと同じであり、欠落している場合が含まれます。

Bashはglobを配列定義に拡張し、正しく拡張します。スペースや同様の分割はありません。

nullglobの使用に関する警告:nullglobをオンにすると、カールは引数を渡さなかったと文句を言い、curl google.com/search?q=test現在のls /var/fasdfasafs*ディレクトリリストを提供します。これがデフォルトでオンになっていない理由の1つです。

おすすめ記事