zeus_masta_funk
zeus_masta_funk

Reputation: 1498

Bash script won't work: command not found

I'm trying to create a simple shell script to list the first input 6 times, a line, then report the size of the second input. Here is my script:

#!/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

Here is the error I receive when trying to use:

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

./script1.sh: line 19: [131234: command not found This is a small number.

I suppose it partially works but something about the command -lt and -gt is causing an error. Running on both Linux and Terminal (OS X) provide the same error.

Upvotes: 1

Views: 2085

Answers (3)

fedorqui
fedorqui

Reputation: 289675

You need spaces on your [] condition:

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

and

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

instead of

if [$2 -gt 1000]     #line 19

and

while [$i -lt 7]    #line 11

Note that otherwise it will not consider these expressions as it should. Instead, it understand them as a string called [$2 or [$i.

Upvotes: 8

user2728929
user2728929

Reputation: 1

$ \[.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 [email protected]
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'

Work with Cygwin+Bash, should work in any environment ,IMHO.

Upvotes: 0

Kevin
Kevin

Reputation: 56059

You need spaces around []:

while [ $i -lt 7 ]    #line 11

And the other lines with [].

[ is a command like anything else, so when you use [$i, it's trying to execute [$i, in this case [0 and [121234.

Upvotes: 2

Related Questions