bash中的错误 - 期望存在-e的一元运算符

时间:2012-11-22 21:10:43

标签: linux bash

我想测试两个变量是否存在,在我使用" read"创造它。如果用户只输入我想要的两个变量之一,则会显示错误。

有我的代码:

while true;
do
  echo "Saisissez deux variables x et y sous la forme [x y]"
  read x y

  if [ !-e $x ] || [ !-e $y ] <<<<<< problem ligne
  then
    echo "Vous devez renseigner deux nombres x et y"
  elif [ $x = "." ]
  then
    exit 0
  else
    calcul $x $y
  fi
done

当我输入参数时出现错误:

[: !-e: unary operator expected

感谢您的帮助:)

3 个答案:

答案 0 :(得分:9)

将其更改为:

if [ -z "$x" ] || [ -z "$y" ]

解释

  • [实际上是内置的shell(在提示符下尝试which [help [);它是test的同义词。
  • -z[的参数。它表示“测试下一个字符串的长度是否为0;如果是,则返回true;否则返回false。
  • 始终用双引号包装您正在测试的变量!

以下是[的有用选项列表,因为我认为您会感兴趣:

-b file = True if the file exists and is block special file. 
-c file = True if the file exists and is character special file. 
-d file = True if the file exists and is a directory. 
-e file = True if the file exists. 
-f file = True if the file exists and is a regular file 
-g file = True if the file exists and the set-group-id bit is set. 
-k file = True if the files "sticky" bit is set. 
-L file = True if the file exists and is a symbolic link. 
-p file = True if the file exists and is a named pipe. 
-r file = True if the file exists and is readable. 
-s file = True if the file exists and its size is greater than zero. 
-s file = True if the file exists and is a socket. 
-t fd = True if the file descriptor is opened on a terminal. 
-u file = True if the file exists and its set-user-id bit is set. 
-w file = True if the file exists and is writable. 
-x file = True if the file exists and is executable. 
-O file = True if the file exists and is owned by the effective user id. 
-G file = True if the file exists and is owned by the effective group id. 
file1 –nt file2 = True if file1 is newer, by modification date, than file2. 
file1 ot file2 = True if file1 is older than file2. 
file1 ef file2 = True if file1 and file2 have the same device and inode numbers. 
-z string = True if the length of the string is 0. 
-n string = True if the length of the string is non-zero. 
string1 = string2 = True if the strings are equal. 
string1 != string2 = True if the strings are not equal. 
!expr = True if the expr evaluates to false. 
expr1 –a expr2 = True if both expr1 and expr2 are true. 
expr1 –o expr2 = True is either expr1 or expr2 is true.

答案 1 :(得分:1)

在这种情况下,运营商-e不适合使用。运营商-z是正确的运营商。这将检查字符串是否为空;在您的情况下xy

所以改变这个:

if [ !-e $x ] || [ !-e $y ]

到此:

if [ ! -z $x ] || [ ! -z $y ]

运算符-e用于检查文件是否存在。

答案 2 :(得分:0)

在bash中,您可以使用:

if [[ -z $x || -z $y ]]; then

[[有许多功能,比test / [更容易使用,包括将||&&直接放入的功能表达式,以及您不需要引用参数扩展的事实,因为[[会自动执行此操作。

help [[

会给你一些更多的信息,虽然它遗漏了这个有用的段落,你可以在man bash找到:

  Word splitting and pathname expansion are not performed on the
  words between the [[ and ]]; tilde expansion, parameter and
  variable expansion, arithmetic expansion, command substitution,
  process substitution, and quote removal are performed. Conditional
  operators such as -f must be unquoted to be recognized as primaries.