如何使用不同的变量两次运行密码功能?

时间:2017-05-17 17:20:07

标签: bash function variables

我有一个我从How do I echo stars (*) when reading password with read?

借来的密码功能

我尝试调整它以便我可以运行该函数两次来进行密码确认,然后评估2个密码以确定它们是否匹配,但我似乎缺少一些bash如何在这种情况下工作的基础知识。 / p>

我尝试用PASSWORD替换$1,但不断收到command not found次错误

passWord() {
  unset PASSWORD
  unset CHARCOUNT
  stty -echo
  CHARCOUNT=0
  while IFS= read -p "$PROMPT" -r -s -n 1 CHAR; do
      # Enter - accept password
      if [[ $CHAR == $'\0' ]] ; then
          break
      fi
      # Backspace
      if [[ $CHAR == $'\177' ]] ; then
          if [ $CHARCOUNT -gt 0 ] ; then
              CHARCOUNT=$((CHARCOUNT-1))
              PROMPT=$'\b \b'
              PASSWORD="${PASSWORD%?}"
          else
              PROMPT=''
          fi
      else
          CHARCOUNT=$((CHARCOUNT+1))
          PROMPT='*'
          PASSWORD+="$CHAR"
      fi
  done
  stty echo; echo
  ${1}=${PASSWORD}
}

echo -n "Enter the password > "
passWord passOne
echo -n "Please re-enter the password > "
passWord passTwo
if [[ $passOne == $passTwo ]]; then
   PASSWORD=$passOne
else
   echo "Passwords did not match, please try again."
fi

更新 这是带有最新更新的脚本

#!/bin/bash
passWord() {
  unset password
  local prompt char
  stty -echo
  charcount=0
  while IFS= read -p "$prompt" -r -s -n 1 CHAR; do
    # Enter - accept password
    if [[ $char == $'\0' ]] ; then
      break
    fi
    # Backspace
    if [[ $char == $'\177' ]] ; then
      if [ $charcount -gt 0 ] ; then
        charcount=$((CHARCOUNT-1))
        prompt=$'\b \b'
        password="${password%?}"
      else
        prompt=''
      fi
    else
      charcount=$((charcount+1))
      prompt='*'
      password+="$char"
    fi
  done
  stty echo; echo
}

echo -n "Enter the password > "
passWord
pass1=$password
echo -n "Please re-enter the password > "
passWord
pass2=$password
if [[ "$pass1" == "$pass2" ]]; then
  PassWord=$pass1
else
  echo "Passwords did not match, please try again."
fi

1 个答案:

答案 0 :(得分:2)

您缺少贝壳的声明。
请添加一个shebang作为第一行:

  $(".card-link:first").click(function() {
    if ($(".card-link:first").text()==='Show comments') { 
      $("ul.list-group.list-group-flush").show(); 
      $(".card-link:first").text('Hide comments');
    } else  {
       $("ul.list-group.list-group-flush").hide();
       $(".card-link:first").text('Show comments');
   }
  }

变量的分配(行#!/bin/bash )不起作用 解决它的一种方法(不推荐)是添加eval:

${1}=${PASSWORD}

但由于这会使任何输入成为安全问题,因此您应该使用其他一些行。

一种解决方案是使用declare(bash 4.2 +):

eval "${1}=${PASSWORD}"     # don't use quite risky.

declare -g "${1}=${PASSWORD}" 是必需的(自bash 4.2起必需且可用)来更改常规变量(不是函数的本地变量)。

或者使用printf(自bash 3.1起):

-g

除此之外,您应该为函数内部使用的变量添加本地命令,以避免与外部变量冲突,并且应该在循环之前添加printf -v "${1}" '%s' "${PASSWORD}" 以避免在调用函数时打印初始星号第二次。

应该说应该避免在CAPS中使用变量。 CAPS中的变量表示环境变量,其余变量使用小写以避免冲突。