列出文件並將其儲存在變數中

列出文件並將其儲存在變數中

我是 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

相關內容