スペースを含む構成された文字列のリストから選択しますか?

スペースを含む構成された文字列のリストから選択しますか?

select次のように選択したいスペースを含む文字列のリストを作成しようとしています。

sel=""
while read l   
do
  sel=$(printf "%s '%s'" "$sel" "$l")
done< <(cd /some/data/directory;du -sh *) 

select x in $sel
do
  break
done

文字列はsel予想:と似ています"597G 2022" "49G analysis" "25K @Recycle"が、選択肢は次のとおりです。

1) "597G      3) "49G       5) "25K
2) 2022"      4) analysis"  6) @Recycle"
#?

私が達成したいのはもちろんです。

1) 597G 2022
2) 49G  analysis
3) 25K  @Recycle
#?

より一般的には、複数のデータソースから任意の方法で構成された文字列から選択できます。私は次のようないくつかの場所でインスピレーションを探しています。ここしかし、私の場合は合いません。

編集する

このbashはかなり古いことを言及するのを忘れていました(悲しいことに更新することはできません)。

[admin@CoMind-UniCron ~]# bash --version
GNU bash, version 3.2.57(1)-release (x86_64-QNAP-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

ベストアンサー1

シェルによって適切に分割される必要がある単一の文字列ではなく、複数の文字列の配列が必要です。このような:

#!/bin/bash

while read l   
do
  sel+=( "$l" )
done< <(cd /some/data/directory;du -sh *) 

select x in "${sel[@]}"
do
  break
done

これにより、予想される出力が生成されます。

$ foo.sh
1) 597G 2022
2) 50G  analysis
3) 32K  @Recycle
#? 

改行を除く任意のファイル/ディレクトリ名を処理でき、少し複雑ですが、すべての場合に心配することなく使用できるより安全な方法です。

#!/bin/bash

while IFS= read -r l   
do
  sel+=( "$l" )
done< <(shopt -s nullglob dotglob; cd /some/data/directory && du -sh -- *) 

select x in "${sel[@]}"
do
  break
done

おすすめ記事