【问题标题】:Bash script won't work: command not foundBash 脚本不起作用:找不到命令
【发布时间】:2013-10-17 14:52:42
【问题描述】:

我正在尝试创建一个简单的 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:第 19 行:[131234:找不到命令 这是一个很小的数字。

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

【问题讨论】:

    标签: linux bash shell terminal


    【解决方案1】:

    [] 条件上需要空格:

    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 的字符串。

    【讨论】:

      【解决方案2】:

      [] 周围需要空格:

      while [ $i -lt 7 ]    #line 11
      

      还有[]的其他行。

      [ 是一个和其他命令一样的命令,所以当你使用[$i 时,它会尝试执行[$i,在本例中是[0[121234

      【讨论】:

        【解决方案3】:
        $ \[.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,应该可以在任何环境中工作,恕我直言。

        【讨论】:

          猜你喜欢
          • 2015-08-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 2021-12-08
          • 2016-10-07
          • 1970-01-01
          • 2014-05-23
          • 2023-02-05
          相关资源
          最近更新 更多