2014-12-03 86 views
0

我創建了以下bash腳本,從用戶獲得口令完美的作品:BASH - 函數來獲取用戶密碼

while [ -z "$PASSWORD" ] 
do 
    echo "Please enter a password:" 
    read -s PASSWORD1 
    echo "Please re-enter the password to confirm:" 
    read -s PASSWORD2 

    if [ "$PASSWORD1" = "$PASSWORD2" ]; then 
     PASSWORD=$PASSWORD1 
    else 
     # Output error message in red 
     red='\033[0;31m' 
     NC='\033[0m' # No Color 
     echo "" 
     echo -e "${red}Passwords did not match!${NC}" 
    fi 
done 

# This is just here to prove script works 
echo "password is: $PASSWORD" 

但是,如果我把它放在一個功能,它停止工作:

function getPasswordFromUser() 
{ 
    while [ -z "$PASSWORD" ] 
    do 
     echo "Please enter a password:" 
     read -s PASSWORD1 
     echo "Please re-enter the password to confirm:" 
     read -s PASSWORD2 

     if [ "$PASSWORD1" = "$PASSWORD2" ]; then 
      PASSWORD=$PASSWORD1 
     else 
      # Output error message in red 
      red='\033[0;31m' 
      NC='\033[0m' # No Color 
      echo "" 
      echo -e "${red}Passwords did not match!${NC}" 
     fi 
    done 
    echo $PASSWORD 
} 

PASSWORD=$(getPasswordFromUser) 

# This is just here to check if script worked 
echo "got password $PASSWORD" 

如果我改變從PASSWORD=$(getPasswordFromUser)向函數調用:getPasswordFromUser;那麼該方法開始「工作」,但密碼是輸出到屏幕上,我還沒有捕捉到它。

有沒有一種方法來更新這個bash腳本,這樣我可以調用一個函數來從用戶那裏獲取密碼而沒有被顯示在終端密碼?

  • 萬一它很重要,這是Debian/Ubuntu。

回答

2

如果你調用函數一樣myvar=$(myfunction)會趕上第一echo聲明。

你可以做的是在函數中定義一個變量,然後訪問它。在bash中沒有範圍,所以一旦函數執行完畢,你就可以訪問它。

查看他們中的每一個例子:

$ cat a 
#!/bin/bash 

function myf() 
{ 
echo "heeeiiii" 
echo "hellO" 

} 

function myf2() 
{ 
echo "lets define var MYTEST" 
MYTEST="this is my test" 
} 

r=$(myf) 

echo "this is myf: $r" 

echo "MYTEST=$MYTEST" 
myf2 
echo "MYTEST=$MYTEST" 

執行:

$ ./a 
this is myf: heeeiiii 
hellO 
MYTEST= 
lets define var MYTEST 
MYTEST=this is my test 
+1

謝謝!關鍵是:「在bash中沒有範圍,所以一旦函數執行完畢就可以訪問它,所以我可以運行'getPasswordFromUser;'並且'PASSWORD'將被設置在函數之外。不需要在該函數內部回顯密碼並嘗試捕獲它。 – Programster 2014-12-03 13:55:00

0

你的第一次嘗試是正確的:

~$ PASSWORD=$(getPasswordFromUser) 
~$ echo $PASSWORD 
Please enter a password: Please re-enter the password to confirm: a 

你就是不看「請輸入密碼「,因爲它被$(..)捕獲。

您有幾種可能性:

  • 使用全局變量
  • 使用不同的描述符
  • 具備的功能需要一個變量作爲第一個參數,並要返回字符串修改變量。

一些實例可在how to return a string value from a bash function可以發現,Advanced Bash-Scripting Guide,或linux journal

1

函數中的大部分輸出應寫入標準錯誤,而不是標準輸出。

getPasswordFromUser() 
{ 
    while [ -z "$PASSWORD" ] 
    do 
     echo "Please enter a password:" >&2 
     read -s PASSWORD1 
     echo "Please re-enter the password to confirm:" >&2 
     read -s PASSWORD2 

     if [ "$PASSWORD1" = "$PASSWORD2" ]; then 
      PASSWORD=$PASSWORD1 
     else 
      # Output error message in red 
      red='\033[0;31m' 
      NC='\033[0m' # No Color 
      echo -e "\n${red}Passwords did not match!${NC}" >&2 
     fi 
    done 
    echo "$PASSWORD" 
} 

此外,一定要在最後一行引用$PASSWORD;有人可能會在他們的密碼中使用多次運行的空白或shell全局字符!