Bash脚本不起作用:找不到命令

时间:2013-10-17 14:52:43

标签: linux bash shell terminal

我正在尝试创建一个简单的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 test 131234   ./script1.sh:line 11:[0:命令未找到

     

./ script1.sh:line 19:[131234:找不到命令   这是一个很小的数字。

我认为它部分有效,但有关命令-lt和-gt的信息导致错误。在Linux和终端(OS X)上运行会产生相同的错误。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

您需要[]周围的空格:

while [ $i -lt 7 ]    #line 11

其他行[]

[是一个与其他任何内容类似的命令,因此当您使用[$i时,它会尝试执行[$i,在这种情况下[0和{{ 1}}。

答案 2 :(得分: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,应该适用于任何环境,恕我直言。