2017-02-04 49 views

回答

4

這很簡單。

#!/bin/bash 
dir="." 
for file in "$dir"/* 
do 
    [[ -f "$file" ]] || continue 
    var="${file##*/}" 
    if 
    printf -v "$var" "$(<"$file")" 2>/dev/null 
    then 
    export "$var" 
    else 
    echo "Invalid filename: $file" 
    fi 
done 

並非所有的文件名都是有效的變量名稱。您需要100%確定所有可以使用腳本的文件都具有有效的變量名稱,或者(最好)執行某種測試或錯誤處理。上面的腳本將檢測到一個失敗的任務,但除了抱怨之外不會做任何聰明的事情。

一些解釋...

如果文件不是常規文件中的循環體被跳過(即目錄,特殊文件被跳過)。

代碼使用-v選項printf,這會導致printf分配的名稱被提供,而不是打印到標準輸出。這比安全地使用eval更安全,這會打開代碼注入的可能性,尤其是考慮到您使用的是腳本無法控制的文件名。

"$(<"$file")"語句是一個命令替換,輸出文件的內容,就像產生字符串而不是流的重定向一樣。

最後,請注意,如果你想爲export變量準備其他事情,你的腳本會做,你很好。但是,如果要將這些變量導出到調用腳本的shell中,則需要使用.(或source)執行腳本,因爲子進程無法將變量導出(或進行任何類型的賦值)其父母。 Sourcing使shell從指定的文件中讀取命令,而無需啓動子進程。

+0

值得一提的是,從腳本中導出不會影響父shell。如果這是OP的目標。 (源於父母的結果是可能的) –

+0

@ DavidC.Rankin好點,會相應更新。 – Fred

+0

使用此代碼拋出錯誤爲無效文件名:c:/ mydir/a其中說「a」是文件名 – Harsh