![列出文件並將其儲存在變數中](https://rvso.com/image/38694/%E5%88%97%E5%87%BA%E6%96%87%E4%BB%B6%E4%B8%A6%E5%B0%87%E5%85%B6%E5%84%B2%E5%AD%98%E5%9C%A8%E8%AE%8A%E6%95%B8%E4%B8%AD.png)
我是 shell 程式設計新手。我的目標是讓使用者選擇應該執行哪個檔案。我使用以下命令在一個 var 中捕獲所有可用的腳本:
var=$(find script*)
到目前為止一切順利,這是輸出:
echo $var
script1 script2 script3 scr...
現在我想將每個檔案儲存在一個變數中以便在以後的選擇中運行它
select SEL in script1 script2 script3 ..........
case $SEL in
$Script1) echo ($Script1 will start) && ./$script1 ;;
$Script2) echo ($Script2 will start) && ./$script2 ;;
$Script3) echo ($Script3 will start) && ./$script3 ;;
$Sc..) echo ($Scr.... will start) && ./$scrip.... ;;
$Sc...) echo ($Sc...... will start) && ./$scrip..... ;;
*) echo "choose on of the availabel files";;
esac
done
如果我不知道每個文件的數量和確切長度,我不知道我應該如何分隔所有文件。
我嘗試用 echo ${var[1]} 和 echo $var[1] 進行分割,但這不起作用。我收到一個空輸出或整個字串。
答案1
你的第一行:
var=$(find script*)
只是創建var
一個包含所有script*
內容的字串變數。它是不是一個數組,所以我們不能[]
像你想要的那樣對其進行索引。
實際上是script*
由 shell 擴展的,所以find
在那裡不做任何事情(除非它們是目錄,但看起來不像)——它只是獲取所有檔案名稱作為參數,檢查它們是否存在,然後直接列印它們再次退出。 shell 實際上完成了所有工作..
相反,我們可以製作一個大批,我們可以使用 shell 的全球擴張直接填充它:
files=(script*)
當我們將初始化程序( 的右側=
)放在括號中時,我們正在建立一個數組,該數組分別保存多個值。script*
將擴展到script
目前目錄中以開頭的每個檔案名稱。如果檔案名稱中有空格,它們不會導致單字像$()
數組初始值設定項目內的命令(反引號或 )那樣被分割。
此時我們可以讀入一些使用者輸入:
select SEL in "${files[@]}"
do
if ! [ "$SEL" ]
then
echo "Choose one of the available files."
continue
fi
echo "$SEL will start"
"./$SEL"
break
done
我們編寫"${files[@]}"
乾淨地擴展整個文件名數組以提供給select
.將向使用者提供文件選擇,然後我們進入該do...done
區塊。
如果$SEL
為空,則使用者選擇了一個不存在的條目,因此我們列印提示,並continue
要求他們再次選擇。
否則,我們echo
會收到腳本將啟動並執行腳本的通知。我們引用該名稱"./$SEL"
是為了防止腳本名稱中包含空格,否則會導致命令名稱被視為./firstword
,其餘單字作為參數。break
阻止我們返回並再次詢問用戶;如果你想這樣做,就把它拿出來。
您case...of
使用的似乎在您給出的示例中沒有太大效果,但是如果您確實有一些單獨的行為,具體取決於所選的腳本(並且它必須位於這腳本),您可以將其放在do...done
區塊內。
答案2
不是 100% 確定我完全理解你想要做什麼,但這對你來說可能會更好:而不是 var=$(find script*) 和一個你可以更好使用的案例
for i in `find script*`
do
echo ($i will start)
./$i
done