添付コマンド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
ここに質問があります(最後に):その£記号なしで選択メニューにファイル名を出力する方法はありますか?
ls
の代わりにShell globを使用します。
select option in "Exit" "$1"/*
.
.
.
Elif [ -n "$option" ]; then
ls "$option"
else
.
.
.