web-dev-qa-db-ja.com

ファイルのリストを表示するselectコマンドを使用したシェルスクリプト

添付コマンドbstls.shシェルスクリプトを作成しました。これは、コマンドselectを使用して、lsコマンドを実行する引数として渡されたフォルダー内のサブフォルダーまたはファイルを選択します。

#! /bin/bash
#Personal version of Shell command ls which presents to user the list of files with Shell command select
#Usage: bstls.sh folder

#if parameter numbers is different from one, exit
if [ $# -ne 1 ]
then
    echo -e "Usage:\n\tbstls folder"
    exit 1
fi

PS3='Which element to ls?'
#command sed substitutes blank spaces with £ in file or folder names
#in this way user can select files or folders with blank spaces in between

list="Exit $(ls "$1" | sed 's/ /£/')"
select option in $list
do
    if [ "$option" = "Exit" ] #if user selects Exit, then exit the program
    then
        exit 0
    Elif [ -n "$option" ] #if name is valid, shows the files inside
    then
        #reuse sed command to reconvert to original file name
        filename=$(echo "$option" | sed 's/£/ /')
        ls "$1"/"$filename"
    else #if the number of the choice given by user is wrong, exit
        echo "Invalid choice ($REPLY)!"
    fi
done

私の主な問題は、選択オプションのリストにスペースを含むファイル名を表示する方法です。たとえば、サブフォルダfooとその中にファイルhello worldを持つフォルダtempがあり、次を起動する場合

./bstls.sh temp  

オプションから選択する必要があります

1)Exit 
2)foo 
3)hello 
4)world  

(最後の2つは互いに分離されています)。

今、私の本当の質問に行きます。私は、sedコマンドで記号£を使用して空白スペースを変換するこの問題を解決しようとしました。

list="Exit $(ls "$1" | sed 's/ /£/')"  

このように、空白スペースを含む名前は、selectコマンドによって1つとして処理できます。
次に、lsコマンドを使用するときに記号£を空白スペースで再度変更します。

filename=$(echo "$option" | sed 's/£/ /')  

だから今、起動するとき

./bstls.sh temp  

選択肢があります

1)Exit 
2)foo
3)hello£world

ここに質問があります(最後に):その£記号なしで選択メニューにファイル名を出力する方法はありますか?

2
Dav Serf

lsの代わりにShell globを使用します。

select option in "Exit" "$1"/*
.
.
.
Elif [ -n "$option" ]; then
  ls "$option"
else
.
.
.
7
steeldriver