web-dev-qa-db-fra.com

Script shell avec commande select pour afficher une liste de fichiers

J'ai écrit le script shell bstls.sh joint, qui utilise la commande select pour choisir le sous-dossier ou le fichier d'un dossier passé en tant qu'argument sur lequel exécuter la commande 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

Mon principal problème est de savoir comment afficher les noms de fichiers avec des espaces dans la liste des options de sélection. Par exemple, si j'ai un dossier temp avec le sous-dossier foo et le fichier hello world à l'intérieur, lancez ce qui suit

./bstls.sh temp  

devrait me faire choisir parmi l'option

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

(les deux derniers séparés l'un de l'autre).

Maintenant, je passe à ma vraie question. J'ai essayé de résoudre ce problème en convertissant les espaces vides avec le symbole £ avec la commande sed.

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

De cette manière, les noms avec des espaces vides peuvent être traités comme un seul par la commande select.
Je change alors encore le symbole £ avec un espace quand j'utilise la commande ls.

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

Alors maintenant, lors du lancement

./bstls.sh temp  

J'ai les choix

1)Exit 
2)foo
3)hello£world

Voici la question (enfin): existe-t-il un moyen d’afficher dans le menu de sélection des noms de fichier sans ce symbole £?

2
Dav Serf

Utilisez un shell glob au lieu de ls:

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