使用 su 檢查使用者的環境變數是否存在

使用 su 檢查使用者的環境變數是否存在

我幾天來一直在研究這個問題,我需要檢查使用者 $1 是否存在環境變數 $2 。

我嘗試了一些案例:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(所以不(我嘗試過 Bash > 4.2))

if [ su - ${1} -c "[ -z "${2}" ]" ]

現在,我正在嘗試這種方法,因為我沒有發現問題所在:/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

答案1

第一個範例中的語法不正確。如果你寫:

[[ -v $HOME ]]

那麼你實際上正在執行命令:

[[ -v /home/yourusername ]]

這當然會失敗。你要:

[[ -v HOME ]] && echo ok || echo no

您可以將其與su以下內容結合:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

您的最後一個範例將不起作用,因為您無法嵌套引號,並且 shell 變數擴展發生在命令執行之前。也就是說,給定:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

您執行的命令實際上是:

su - root -c 'echo /home/somesuser | ...'

$HOME如果您想要從 的角度取得的值root,則需要防止本機 shell 中的變數擴展,例如使用單引號:

su - root -c 'echo $HOME | ...'

我不清楚為什麼要將輸出傳遞給wc,因為 的字數$HOME幾乎總是為1。您可以僅使用該選項來獲取字數,而不是對wcwithsed或的輸出進行後處理:cut-w

su - root -c 'echo $HOME | wc -w'

相關內容