Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux下的shell与make

一、shell

1.1 什么是shell

● 用户与Linux的接口● 命令解释器● 支持多用户● 支持复杂的编程语言● Shell有很多种,如:csh,tcsh,pdksh,ash,sash,zsh,bash等。Linux的缺省Shell为bash(Bourne Again Shell)。Shell是用户和操作系统之间最主要接口。通过Shell,可以同时在后台运行多个应用程序,并且在把需要与用户交互的程序放在前台运行。通过在多条命令的序列中使用变量和流程控制,Shell可以作为一名复杂的编程语言。

1.2 转义字符和通配字符

● 转义字符(metacharacters)指的是在Shell中有特殊含义的字符。 例如:< > | ; ! ? * [ ] $ " " ` ~ ( ) { } ^#ls file[1-10].c #count=`ls –l | grep ‘^d’| wc –l`● 通配字符(wildcards)是转义字符的子集,用来查找匹配文件名 例如:? * [] [-] [!]● 使用<Tab>键,可以自动补齐。通配一个字符:"?"通配多个字符:"*"

1.3 输入输出重定向

● 系统定义三个标准文件:标准输入(stdin)、标准输出(stdout)、标准错误输入(stderr)● 管道符:"|",将前一个命令的输出转成下一个命令的输入。● 过滤器(filters):用来接收标准输入,经过一定的转化,再写到标准输出。所以,过滤器一般放在管道符中间。每个程序起动时,就有三个文件描述:STDIN (0),STDOUT(1),STDERR(2)。用"<"改变输入,用">"改变输出,用"2>"改变错误输出,用">>"来追加到已有的文件中。常用的过滤器如下:expand,sed,awk,fmt,tac,tr,grep,nl,pr。多条命令可以输入到一行中,并用";"字符分隔。在一行命令后加""表示另起一行继续输入,下一行的提示符变为">"printf(“ ”);

1.4 Shell变量

● Shell变量(Variables)是程序用来保存数据用的。● Shell特殊变量:系统定义了一些特殊的变量。如$HOME等。使用set命令查看当时系统中定义的变量。系统定义的特殊变量有:$TERM(当前终端类型),$PATH(命令的搜索路径),$MANPATH(手册页存放的目录),$HOME(用户主目录),$LANG(当前使用语言),$PS1,$PS2(命令提示符),$SHELL(当前Shell名)。在命令行上打入:变量名=变量值,可以定义变量。使用 echo $变量名查看变量值。使用 unset 取消对变量的定义。#hello=”123”单引号表示忽略其中所有的转义字符,双引号表示忽略其中除了 $ ` 以外的其他的转义字符。反斜线()表示忽略下一个转义字符。多条命令可以输入到一行中,并用";"字符分隔。在一行命令后加""表示另起一行继续输入,下一行的提示符变为">"

● Shell系统变量

$?:最近执行的命令返回的值;    $$:本进程的进程号$!:最近后台进程号$#:shell自变量个数,$1表示第一个自变量

● Shell用户变量

#varname=value :赋值    #readonly varname :标记只读#export varname :标记移出:变量可以被子进程继承#setenv PATH=/home:/usr:/etc:/bin:/usr/bin: (csh中)#varname=` expr $varname  +  1 ` :变量值增1  #x=$[ $x + 1 ]#echo $PATH

1.5 定制用户环境

● 用户在登录Shell时,会依次执行一系列的脚本。● 使用alias命令,可以定义一些别名。Alias ‘rm –f’ rm登录BASH时,用户将依次执行一系列的脚本:/etc/profile , $HOME/.bash_profile ( 如果没有,执行 $HOME/.bash_login ,还没有,执行 $HOME/.profile)。注销时,会自动执行 $HOME/.bash_logout 。使用 RedHat 的用户,登录时除了这两个文件以外,还会自动执行 $HOME/.bashrc ,这个文件又会再执行 /etc/bashrc

1.6 条件控制

1)test命令测试文件、变量的属性,表达式的值,或命令执行返回值。test –d  /usr  à [ -d /usr ]test –f  .bashrc à [ -f .bashrc ]test $count –gt 0 à [ $count –gt 0 ]2)if语句    if (expression) then       command-list    else       command-listfi    3)case语句      case $var in        pattern1) command-list  ;;         pattern2) command-list  ;;          … esac4)逻辑运算符 && 和 ||# test –f myfile.c && echo “file found”if test –f myfile.c then    echo “file found”fi# test –f myfile.c | | echo “file not found”if test ! –f myfile.c then   echo “file not found”fi

1.7 循环控制

    1)for语句    for var in word-list      do       command-listdone  for count in 1 2 3  do       echo $I  donefor var do      2)while语句      while (expression)       do          command-list      done #greeting=’hello world’i = 1while test $i –le 100 ; do   case $i in           *0) echo “**********”>file$i ;;           *)  echo $i > file$i ;;   esac   i = ` expr $i + 1 `done例:append命令的实现:case $# in 1)   cat >> $1 ;;2)   cat < $1>> $2 ;;*)  echo ‘usage: append [from] to ’;;esac#chmod +x myappend#myappend file1 file2 

1.8函数

    functionname( )    {       command-list}usage(){   echo “usage:…..$1”}usage “from … to “注意:函数的使用就象可执行程序一样,但必须先定义,后使用。

 1.9 here文档

here文档指在shell脚本中指定输入源,而不是来自文件或标准输入,其中的“<<”是here文档保留字。# mail cindy << !@$happy birthdayI love you!@$

 1.10 shell内部命令:不产生子进程

  1) eval:在shell程序中,利用变量的值来构建命令A=lsB= ‘ | wc -w’eval  $A$B  2) exec:转去执行exec后命令,不建立新进程,也不返回到当前的执行过程,相当于go to 语句。#cat execdemoexec dateecho hello  3) read:从标准输入设备(键盘)读入一行,并把读入的字依次赋给各变量,所有剩余的字赋给最后一个变量。#cat parrot echo  “you say:c” read what echo  “I repeat:$what”  4) shift:使命令行参数向左移动一位,并使记录参数总数的变量$#减1   #cat shiftdemowhile test $# != 0do   echo $1 $2 $3   shiftdone   #shiftdemo  a  b  ca b cb cc   5)wait:等待当前进程所有子进程结束,若wait后跟参数n,则等待进程n结束。   #cat waitdemoecho “This is a new file”(sleep 5; date)&wait echo “the file terminate”执行结果: This is a new file April 20 10:08:26 BJT 2002-04-20 The file terminate   6) trap:中断处理命令trap 命令表  中断信号表#cat trapfiletrap  echo ‘ This is INT 2’  2 trap  echo ‘ This is INT 3’  3 for I in /bin /bin/usrdo    echo $Idone   下面程序实现scan:扫描当前目录下的每一个子目录,并执行用户提交的命令:d=`pwd`for i in *do   if test –d $d/$i    then       cd $d/$i        while echo “$i:”            trap exit 2            read x       do trap : 2 ; eval $x; done    fi done7)点命令 .   在bsh利用 . 命令执行一个命令时,不创建子进程。(csh中用source)8)空命令:不做任何事情 

1.11 shell程序实例

  下面程序dircmp测试当前目录与指定目录是否含有相同文件数    if  test $# -ne 1  then     echo “Usage:dircmp dirname”    exit 1  else if  test !-d $1 then         echo “”$1” is not a directory”          exit 1      else         this = `ls –l |grep ‘^-’ |  wc –l `         that = `ls –l $1 |grep ‘^-’ | wc –l `         if  test  $this –ne $that  then            echo “Current directory and ”$1” do not match”          elseecho “Current directory and ”$1” have same number of files”          fififi#dircmp abc“abc” is not a directory

1.12 shell程序的执行方法:

 1) $chmod u+x dircmp    $./dircmp /usr/bin 2) $sh dircmp  3) $sh < dircmp 4) $ . dircmp(用点命令执行程序,不创建子进程)  %source dircmp(csh中)