我创建了以下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脚本,以便我可以调用一个函数来获取用户的密码,而不会在终端中显示密码?
答案 0 :(得分: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 :(得分: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 glob字符!
答案 2 :(得分: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中找到一些示例。