我幾天來一直在研究這個問題,我需要檢查使用者 $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
。您可以僅使用該選項來獲取字數,而不是對wc
withsed
或的輸出進行後處理:cut
-w
su - root -c 'echo $HOME | wc -w'