Получение «[: =: ожидается унарный оператор» в программе bash - PullRequest
0 голосов
/ 14 апреля 2020

Я работал над примером bash программы для практики bash написания сценариев, но всякий раз, когда я пытаюсь запустить его с правильными переменными, он выводит "[: =: ожидается унарный оператор" и завершает работу.

#! /bin/bash
clear
i=""
P="PASSWORD"
echo "Please enter your password"
while [ $i = "PASSWORD" ]
do
read $i
done

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

если $ i пусто, вы получили синтаксическую ошибку из-за недостаточного количества аргументов [= "ПАРОЛЬ"]

  1. вы можете использовать bash параметр [[$ i = "ПАРОЛЬ "]] Но это оператор bash, и он может быть несовместим со старыми оболочками

  2. , вы можете поместить свою переменную в квоты, например [" $ i "=" ПАРОЛЬ " ] Это предпочтительная вещь, вы также исправите проблему, если ваша переменная содержит пробелы или метки расширения оболочки, такие как *,?, [1..9]

0 голосов
/ 14 апреля 2020

но всякий раз, когда я пытаюсь запустить его с правильными переменными, он выводит «[: =: ожидается унарный оператор» и завершает работу.

Это потому, что у вас есть переменная без кавычек / пустая внутри [ либо заключите в кавычки свои переменные, либо используйте [[, который является более безопасным и надежным.

, в то время как [$ i = "ПАРОЛЬ"]

значение $i пусто, пользователь не может указать значение / ввод, поэтому оно не будет работать


Редактировать: Как указано @William Pursell, независимо от того, какой тест вы используете, оно все еще есть некоторая ловушка, урок здесь состоит в том, чтобы дезинфицировать / проверить ввод, например, проверить его, если это действительно di git, если он не пустой и так далее.


Попробуйте, это может сделать то, что вы хотели.

#!/usr/bin/env bash

clear
p="PASSWORD"
read -rp "Please enter your password: " input  ##: Ask the user to enter the password

until [[ $p == "$input" ]]; do ##: The loop will continue until both vars matches
  clear
  printf 'Please try again! %s does not match..\n' >&2 "$input"
  read -rp "Please enter your password: " input
done

##: If it matches print a message and the value of input
printf '%s is a match!\n' "$input" 
...