我需要编写一个密码输入 bash 脚本。Bash 文件必须从命名管道获取值,直到收到 *。
例如:
Bash 获取 1 2 5 6 7 8 ... 5 * (按下键盘后显示每个数字)
脚本中的变量必须是:Result = 125678...5
然后我必须将其与我的验证密码进行比较
例如(我不知道 bash 语法):
while read line && input != "*"
do
passWord_input += line
if(passWord_input == verifPassword)
echo "access granted"
else
echo "access denied
答案1
不要试图重新发明轮子:
passWord_input=""
while [[ "$passWord_input" != "$verifPassword" ]]; do
read -s -r -p "Enter Password: " passWord_input
done
echo "valid password entered"
看https://www.gnu.org/software/bash/manual/bash.html#index-read
答案2
我想不出这样做的充分理由(除非作为家庭作业练习),但是是的,在 bash 中,您可以“使用 read 在 while 循环中添加变量”。特别是,运算符man bash
的注释+=
:
In the context where an assignment statement is assigning a value to a shell variable or array index, the += operator can be used to append to or add to the variable's previous value. . . . When ap‐ plied to a string-valued variable, value is expanded and appended to the variable's value.
例如:
#!/bin/bash
declare +i password_input=""
while IFS= read -s -r -n 1 c; do
case $c in
\*) break
;;
*) password_input+=$c
;;
esac
done
这些-n 1
参数允许您读取单个字符而不是整行。取消设置IFS
变量允许输入包含否则将被字段拆分所消耗的字符(在默认 IFS 的情况下,这可能是也可能不是一个好主意 - 是否应该允许密码包含空格?)。
+i
即使用户输入的是全数字序列,似乎也不需要显式声明,但它清楚地表明其意图是追加而不是求和。
仅供参考,测试字符串相等性的 bash 语法是[[ $str1 == $str2 ]]
。