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 £?
Utilisez un shell glob au lieu de ls
:
select option in "Exit" "$1"/*
.
.
.
Elif [ -n "$option" ]; then
ls "$option"
else
.
.
.