Linux Programming

From 太極
Jump to navigation Jump to search

Shell Programming

Redirect

Redirecting output. File descriptor number 1 (2) means standard output (error).

./myProgram > stdout.txt        # redirect std out to <stdout.txt>
./myProgram 2> stderr.txt       # redirect std err to <stderr.txt> by using the 2> operator
./myProgram > stdout.txt 2> stderr.txt # combination of above two
./myProgram > stdout.txt 2>&1   # redirect std err to std out <stdout.txt>
./myProgram >& /dev/null        # prevent writing std out and std err to the screen
ps >> outptu.txt                # append

Redirecting input

./myProgram < input.txt

Pipe

The operator is |.

ps > psout.txt
sort psout.txt > pssort.out

can be simplified to

ps | sort > pssort.out

Variables

food=Banana
echo $food
food="Apple"
echo $food
$HOME
$PATH
$0 -- name of the shell script
$# -- number of parameters passed
$$ process ID of the shell script, often used inside a script for generating unique temp filenames
$1, $2, .... -- parameters given to the script
$* -- list of all the parameters, in a single variable
$@ -- subtle variation on $*

We can also use parentheses around the variable name.

QT_ARCH=x86_64
QT_SDK_BINARY=QtSDK-4.8.0-${QT_ARCH}.tar.gz
QT_SD_URL=https://xxx.com/$QT_SDK_BINARY

Conditions

We can use the test command to check if a file exists. The command is test -f <filename>.

[] is just the same as writing test, and would always leave a space after the test word.

if test -f fred.c; then ...; fi

if [ -f fred.c ]
then
...
fi

if [ -f fred.c ]; then
...
fi

Arithmetic comparison

expr1 -eq expr2  ==> check equal
expr1 -ne expr2  ==> check not equal
expr1 -gt expr2  ==> expr1 > expr2
expr1 -ge expr2  ==> expr1 >= expr2
expr1 -lt expr2  ==> expr1 < expr2
expr1 -le expr2  ==> expr1 <= expr2
! expr  ==> opposite of expr

File conditionals

-d file  ==> True if the file is a directory
-e file  ==> True if the file exists
-f file  ==> True if the file is a regular file
-r file  ==> True if the file is readable
-s file  ==> True if the file has non-zero size
-w file  ==> True if the file is writable
-x file  ==> True if the file is executable

Control Structures

if

if condition
then
  statements
elif [ condition ]; then
  statements
else 
  statements
fi

for

for variable in values
do 
  statements
done

while

while condition do
  statements
done

until

until condition
do 
  statements
done

AND list

statement1 && statement2 && statement3 && ...

OR list

statement1 || statement2 || statement3 || ...

Functions

Commands

break  ==> escaping from an enclosing for, while or until loop
:      ==> null command
continue ==> make the enclosing for, while or until loo continue at the next iteration
.      ==> executes the command in the current shell
eval   ==> evaluate arguments
exec   ==> replacing the current shell with a different program
export ==> make the variable named as its parameter available in subshells
expr   ==> evaluate its arguments as an expression
printf ==> similar to echo
set    ==> sets the parameter variables for the shell. Useful for using fields in commands that output spaced-separated values
shift  ==> moves all the parameter variables down by one.
unset  ==> remove variables or functions from the environment.

Command Execution

$(command)
`command`
# Example
sudo apt-get install linux-headers-$(uname -r)

Note all new scripts should use the $(...) form, which was introduced to avoid some rather complex rules.

Example

#!/bin/sh
echo The current directory is $PWD
echo The current users are $(who)
exit 0

The concept of putting the result of a command into a script variable is very powerful, as it makes it easy to use existing commands in scripts and capture their output.

Arithmetic Expansion

$((...))

is a better alternative to the expr command.

Parameter Expansion

${parameter}

pause by read -p command

http://www.cyberciti.biz/tips/linux-unix-pause-command.html

read -p "Press [Enter] key to start backup..."

If we want to ask users about a yes/no question, we can use this method

while true; do
    read -p "Do you wish to install this program? " yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

OR

echo "Do you wish to install this program?"
select yn in "Yes" "No"; do
    case $yn in
        Yes ) make install; break;;
        No ) exit;;
    esac
done

Here documents

Debugging Scripts

Working with Files

Low-level File Access

  • file descriptors: 0 means standard input, 1 means standard output, 2 means standard error.
  • size_t write(int fildes, const void *buf, size_t nbytes);
#include <unistd.h>
#include <stdlib.h>
int main()
{
  if ((write(1, "Here is some data\n", 18)) != 17)
    write(2, "A write error has occurred on file descriptor\n", 46);
  exit(0);
}
  • size_t read(int fildes, void *buf, size_t nbytes); returns the number of data bytes actually read. If a read call returns 0, it had nothing to read; it reached the end of the file. An error on the call will cause it to return -1.
  • To create a new file descriptor we use the open system call. int open(const char *path, int oflags, mode_t mode);
  • The next program will do file copy.
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
  char c;
  int in, out;
  in = open("file.in", O_RDONLY);
  out = open("file.out", O_WRONLY|O_CREAT, S_IRUSER|S_IWUSR);
  while(read(in,&c,1) == 1)
    write(out,&c,1)
  exit(0);
}

The Standard I/O Library

  • fopen, fclose
  • fread, fwrite
  • fflush
  • fseek
  • fgetc, getc, getchar
  • fputc, putc, putchar
  • fgets, gets
  • printf, fprintf and sprintf
  • scanf, fscanf and sscanf

Formatted Input and Output

  • prinf, fprintf and sprintf
  • scanf, fscanf and sscanf

Stream Errors

File and Directory Maintenance

Scanning Directories

  • opendir, closedir
  • readdir
  • telldir
  • seekdir

UNIX environment

Logging

Resources and Limits

Terminals

Reading from and Writing to the Terminal

The termios Structure

== Terminal Output

Detecting Keystokes

Curses

A technique between command line and full GUI.

Example: vi.

Data Management

Development Tools

make and Makefiles

Writing a Manual Page

Distributing Software

The patch Program

Debugging

gdb

Processes and Signals

POSIX threads

Inter-process Communication: Pipes

Sockets