各値を二重引用符で囲み、コマンドの出力を配列に格納する方法

各値を二重引用符で囲み、コマンドの出力を配列に格納する方法

各出力を二重引用符で囲んだ配列値に保存したいと思います。値にはスペースを含めることもできます。

FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))

検索コマンドへの入力が非常に最新の場合(非常に最新の情報はファイル名です)。 「非常に最新」として保存する必要があります。非常にという単語を含む他のファイルもあります。したがって、heisveryなどの他のファイルがある場合は、「heisvery」のように保存する必要があります。ここで、「veryverylatest」は配列の0番目の値、「heisvery」は配列の値1です。

答え1

実際には、データの一部ではなく先行引用符と後続引用符で文字列(変数に)を格納する必要がある場合は非常にまれです。通常、後処理が最適です。

var='two  spaces'
printf '# "%s"\n'  "$var"
# "two  spaces"

ary=( 'two  spaces' '$USER' ) 
printf '# "%s"\n'  "${ary[@]}"
# "two  spaces"
# "$USER"

locate出力へ正規化されたパス
この-bオプションは検索のみを意味します。第二asename、
あなたが望むただキャプチャするデフォルト名で、その部分を削除するために
使用できます。 sed/pa/th/

「最新」を検索したいときいっぱいデフォルト名を入力
し、「very」も検索しようとしています。どこかに基本名には
本当に使うべきです正規表現探す。

  • -r 基本正規表現検索
  • --regex拡張正規表現の検索(下記の例で使用)

配列が行全体をキャプチャするには、次の変更を行う必要があります。内部FフィールドS区切り記号(IFS)\nのみが該当します。

配列項目が見つかると、キャプチャ/保存されます。場所出力。配列と同じ順序で並べ替えるには、input配列の追加処理が必要です(次を介して)。for..grep..loop..awk次のような)。

input=( '^very very latest$' 'very' )
IFS=$'\n'; foundfiles=($(locate -i -b --regex "${input[@]}" | sed 's|.*/||'))
foundfiles=($(for((i=0;i<${#input[@]};i++))
              do printf '%s\n' "${foundfiles[@]}" | grep -E "${input[i]}"
              done | awk '!seen[$0]++'))
printf '%s\n' "${foundfiles[@]}"

出力 - 配列全体、つまりインデックス[0]と[1]を表示します。

very very latest
heisvery

欲しいなら印刷機能出力は引用符で囲まれています。最後の行を次に変更します。
printf '"%s"\n' "${foundfiles[@]}"

...または配列自体に引用符を追加する必要がある場合は、次のようにします。for..grep..loop

foundfiles=("${foundfiles[@]/#/\"}")
foundfiles=("${foundfiles[@]/%/\"}")

出力 - 配列全体、つまりインデックス[0]と[1]を表示します。

"very very latest"
"heisvery"

答え2

引用符が欲しくないと思います。私は改行文字ではなく空白でフィールドを分割したくないと思います。

実行方法は次のとおりです。 https://stackoverflow.com/questions/11393817/bash-read-lines-in-file-into-an-array

これは例です

$ IFS=$'\n' read -d '' -r -a FOUNDFILES < <(echo -e "very very latest\nsome other line")
$ echo "${FOUNDFILES[0]}" 
 very very latest
$ echo "${FOUNDFILES[1]}" 
 some other line

<(echo -e "very very latest\nsome other line")それは本当にあなたのlocate命令です。

関連情報