1

我正在尝试创建一个简单的 shell 脚本来列出第一个输入 6 次,一行,然后报告第二个输入的大小。这是我的脚本:

#!/bin/sh

#  script1.sh
#  
#
#  $1=filename $2=number

i=0

while [$i -lt 7]    #line 11
do
  i=$(($i + 1))
  echo $1
done

printf "\n"

if [$2 -gt 1000]     #line 19
then
  echo 'This is a big number!'
else
  echo 'This is a small number.'
fi

这是我尝试使用时收到的错误:

./script1.sh 测试 131234 ./script1.sh: line 11: [0: command not found

./script1.sh: line 19: [131234: command not found 这是一个小数字。

我想它可以部分工作,但是关于命令 -lt 和 -gt 的某些东西会导致错误。在 Linux 和终端 (OS X) 上运行提供相同的错误。

4

3 回答 3

8

您的[]情况需要空格:

if [ $2 -gt 1000 ]     #line 19
    ^           ^

while [ $i -lt 7 ]    #line 11
       ^        ^

代替

if [$2 -gt 1000]     #line 19

while [$i -lt 7]    #line 11

请注意,否则它将不会考虑这些表达式。相反,它将它们理解为一个名为[$2or的字符串[$i

于 2013-10-17T14:53:45.960 回答
2

你需要周围的空间[]

while [ $i -lt 7 ]    #line 11

和其他行[]

[是一个和其他命令一样的命令,所以当你使用 时[$i,它会尝试执行[$i,在这种情况下[0[121234.

于 2013-10-17T14:53:54.547 回答
0
$ \[.exe --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.

      --help     display this help and exit
      --version  output version information and exit

An omitted EXPRESSION defaults to false.  Otherwise,
EXPRESSION is true or false and sets exit status.  It is one of:

  ( EXPRESSION )               EXPRESSION is true
  ! EXPRESSION                 EXPRESSION is false
  EXPRESSION1 -a EXPRESSION2   both EXPRESSION1 and EXPRESSION2 are true
  EXPRESSION1 -o EXPRESSION2   either EXPRESSION1 or EXPRESSION2 is true

  -n STRING            the length of STRING is nonzero
  STRING               equivalent to -n STRING
  -z STRING            the length of STRING is zero
  STRING1 = STRING2    the strings are equal
  STRING1 != STRING2   the strings are not equal

  INTEGER1 -eq INTEGER2   INTEGER1 is equal to INTEGER2
  INTEGER1 -ge INTEGER2   INTEGER1 is greater than or equal to INTEGER2
  INTEGER1 -gt INTEGER2   INTEGER1 is greater than INTEGER2
  INTEGER1 -le INTEGER2   INTEGER1 is less than or equal to INTEGER2
  INTEGER1 -lt INTEGER2   INTEGER1 is less than INTEGER2
  INTEGER1 -ne INTEGER2   INTEGER1 is not equal to INTEGER2

  FILE1 -ef FILE2   FILE1 and FILE2 have the same device and inode numbers
  FILE1 -nt FILE2   FILE1 is newer (modification date) than FILE2
  FILE1 -ot FILE2   FILE1 is older than FILE2

  -b FILE     FILE exists and is block special
  -c FILE     FILE exists and is character special
  -d FILE     FILE exists and is a directory
  -e FILE     FILE exists
  -f FILE     FILE exists and is a regular file
  -g FILE     FILE exists and is set-group-ID
  -G FILE     FILE exists and is owned by the effective group ID
  -h FILE     FILE exists and is a symbolic link (same as -L)
  -k FILE     FILE exists and has its sticky bit set
  -L FILE     FILE exists and is a symbolic link (same as -h)
  -O FILE     FILE exists and is owned by the effective user ID
  -p FILE     FILE exists and is a named pipe
  -r FILE     FILE exists and read permission is granted
  -s FILE     FILE exists and has a size greater than zero
  -S FILE     FILE exists and is a socket
  -t FD       file descriptor FD is opened on a terminal
  -u FILE     FILE exists and its set-user-ID bit is set
  -w FILE     FILE exists and write permission is granted
  -x FILE     FILE exists and execute (or search) permission is granted

Except for -h and -L, all FILE-related tests dereference symbolic links.
Beware that parentheses need to be escaped (e.g., by backslashes) for shells.
INTEGER may also be -l STRING, which evaluates to the length of STRING.

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

NOTE: your shell may have its own version of test and/or [, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report [ bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
For complete documentation, run: info coreutils '[ invocation'

与 Cygwin+Bash 一起工作,应该在任何环境下工作,恕我直言。

于 2013-10-17T15:01:44.057 回答