Shells will allow you to place more than a single command on a line. You do this by placing a semicolon (;) where you would normally hit a carriage return. The shell will execute all the command line in the order that you entered them in, waiting for earlier ones to finish before starting later ones (unless you put them in the background explicitly).
Commands can be grouped using parentheses, where all the commands contained within a grouping are executed as a single process. The most common example I've seen of this is:
(cd /path/to/directory ; tar xf /path/to/tarball.tar)Where you may be in some directory not the same as the one listed above, the tar program unpacks the archive indicated, and then control (a shell prompt) is given back to you in the directory you first started in.
Shell variables, such as PATH can be quite important. You can set them absolutely, you can prepend or you can append. Usually this is done in one of the shell initialisation files.
PATH=/bin:/usr/bin PATH=/usr/local/bin:$PATH PATH=$PATH:$HOME/binThe first command sets the path absolutely, the second prepends /usr/local/bin and the last appends the bin subdirectory of your home directory. If you subsequently invoke a shell (either explicitly or through some mechanism like using a shell script or quoting), some shell variables are inherited by the sub-shell and some aren't. You can explicitly indicate you want variables passed on to sub-shells with the export command in bash and ksh.
Last (for me), if you type set -x to a shell, it will provide you with an execution trace. Typing set -v (verbose) will have the shell echo what it reads. Usually these commands are used in debugging shell scripts, but if you are employing logic and/or flow control constructs on an interactive command line, they may be of use in debugging the command line.