Skip navigation.
Home

Shell Scripting Cheat Sheet

It's like a dos bat file, but with a lot of nifty little features, like actual looping constructs and the ability to mess with program output creatively. For a long time, a large fraction of the net's information infrastructure was programmed using shell scripts. The internet worm of 89 used them. Today, skript kiddies use "hack scripts" that are shell scripts that emit C code, compile it, perform the hack, and then clean up after themselves.

Now I'm going to give you more than you asked for. I'll probably post it somewhere soon.

Here's a quick cheatsheet. Each line is a valid line in a program.

For more advanced notes Advanced Guide.

 #! /bin/sh
 # THIS IS A COMMENT
 # the first line with /bin/sh is a comment, but it's also a unix script  
 #header that tells the program loader to pass the file to the specified 
 #program, in this case, /bin/sh
 ls ; ls ; # commands on a line are separated by semicolons
 X=10; # sets the environment variable X
 echo $X; # the $X is replaced with 10 before the command is  executed
 X=$HOME; # sets X to the home directory
 ls $HOME; # lists contents of home directory
 FIRSTCOMMANDLINEARGUMENT = $1
 SECONDCOMMANDLINEARGUMENT = $2
 THESHELLSCRIPTSNAMEIS = $0


 echo $VAR 
 echo ${VAR} ; # equivalent, but the latter is useful when you
 echo "FOO${VAR}FOO"; #do this kind of string catenation


 # in zsh, the lowercase variable names evaluate math, while uppercase ones do not
 X=2+3; # "2+3"
 x=2+3; # 5
 x="2+3"; # 5
 # I don't remember what sh's behavior is, but it's probably the same




 test -e filename; # test is a special command that tests files, in this  case, for existence
 if (test -e $1) then
  echo $1 exists
 elif (test -d $1) then
  echo $1 is a directory
 fi
 # this tests for the existence of a file before proceeding.  The () 
 # evaluates its contents, and uses the return value.  0 means true,  
 # nonzero, false.  (test returns 0 on success)
 # There's a bug in that code.  This is the fixed code
 if (test -e $1 && test ! -d $1) then
  echo $1 exists but is not a directory
 elif (test -d $1) then
  echo $1 is a directory
 fi
 # the && is a shell programming convention that's like a logical AND.
 # It evals the left side, and if the return value is true (0), executes the right side.
 # The counter part || acts like OR.
 # Sometimes, you see this, which acts like "if the left hand is true, do the right hand"
 test -e $1 && echo "it exists"
 # It's just shorthand.  Likewise, the following means "unless  everything works, do this"
 test -e $1 || echo "the file doesn't exist, aborting" && exit 1


 for var in a b c d
 do
  rm $var
 done
 # That removes the files a b c and d


 for var in `ls`
 do
  echo "**" $var
 done
 # This lists all the files, prepended by "**"
 # The backticks (`) tell the shell to run the command ls, and then replace itself with the command's output.
 # All commands have three kinds of output - the return value, the output, and the error stream


 # About quotes.  Single quote (') means "don't do variable  substitution inside."  Double quotes (")
 # means don't treat spaces as argument separators, substitute variables, but don't expand filenames.
 # 'this is a string', "this is probably an expression", `this is definitely a command`


 # here's a skeletal mutli-mogrify (the mogrify syntax is wrong, but the overall thing should work)


 if (test ! -e $1) || exit 1
 name=`echo $1 | sed -e 's/[.]jpg$//' `
 for geom in 100 120 150 200 260
 do
   mogrify -format jpeg -outputfile ${name}.${geom}.jpg -geometry ${geom} $1
 done


 # Here's a simplistic "in/out" logger.

 CLOCKSTATE='/home/johnk/bin/clock.on'
 CLOCKLOG='/home/johnk/bin/clock.log'
 if ( test -e $CLOCKSTATE ) then 
	rm $CLOCKSTATE
	echo OUT `date` >> $CLOCKLOG
 else 
	touch $CLOCKSTATE
	echo IN  `date` >> $CLOCKLOG
 fi

 # Here's a way to check if a process is running, and if not, start it.
 @ The sed script looks for XWin, and if it finds it, returns a 'y'

 WINUP=`ps | sed -e 's/.*XWin.*/y/;T end; P;: end; d'`
 echo $WINUP
 if (test y != "${WINUP}") then
        startx &
 else
        echo "X is up"
 fi

 # Here's how to copy a file into multiple directories.
 for i in ../*/ ; do cp theFile $i; done