一、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。
tee命令接收标准输入并将数据输出到标准输出和一个文件内。
多条命令可以输入到一行中,并用";"字符分隔。在一行命令后加"\"表示另起一行继续输入,下一行的提示符变为">"
printf(“\t”);

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-list
fi
    3)case语句
      case $var in
        pattern1) command-list  ;;
        pattern2) command-list  ;;
         …
esac
4)逻辑运算符 && 和 ||
# 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-list
done
  for count in 1 2 3
  do
      echo $I
  done
for var
do
 
    2)while语句
      while (expression)
      do
          command-list
      done
#greeting=’hello world’
i = 1
while 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 birthday
I love you
!@$

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

  1) eval:在shell程序中,利用变量的值来构建命令
A=ls
B= ‘ | wc -w’
eval  $A$B
  2) exec:转去执行exec后命令,不建立新进程,也不返回到当前的执行过程,相当于go to 语句。
#cat execdemo
exec date
echo hello
  3) read:从标准输入设备(键盘)读入一行,并把读入的字依次赋给各变量,所有剩余的字赋给最后一个变量。
#cat parrot
 echo  “you say:\c”
 read what
 echo  “I repeat:$what”
  4) shift:使命令行参数向左移动一位,并使记录参数总数的变量$#减1
   #cat shiftdemo
while test $# != 0
do
   echo $1 $2 $3
   shift
done
   #shiftdemo  a  b  c
a b c
b c
c
   5)wait:等待当前进程所有子进程结束,若wait后跟参数n,则等待进程n结束。
   #cat waitdemo
echo “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 trapfile
trap  echo ‘ This is INT 2’  2
trap  echo ‘ This is INT 3’  3
for I in /bin /bin/usr
do
    echo $I
done
   下面程序实现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
 done
7)点命令 .
   在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”
         else
echo “Current directory and \”$1\” have same number of files”
         fi
fi
fi
#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中)

二、make

2. 1  make

大型程序维护工具
Makefile 或 makefile: 告诉make维护一个大型程序,该做什么。Makefile说明了组成程序的各模块间的相互关系及更新模块时必须进行的动作,make按照这些说明自动地维护这些模块。
Netdefs.h                 头文件
Subrs.c                  network.c       源文件
编译
        Subrs.o                 network.o      目标文件
连接
                      Network                可执行文件

在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:
  network: network.o subrs.o                    (1)
         cc –o network network.o subrs.o       (2)
  network.o: network.c netdefs.h                (3)
         cc –c network.c                       (4)
  subrs.o: subrs.c netdefs.h                    (5)
         cc –c subrs.c                         (6)
其中(3)—(6)可以简化为:(隐含的规则)
     network.o subrs.o: netdefs.h
#make
#make network
#make –f makefile

2.2 makefile要点

(1)       宏(变量)
CC=gcc
$(CC) test.c
$@: current target
$<:first prerequisite
$^:all prerequisites
(2)       后缀规则(suffix rules)
.c.o:
$(CC) -c $(CFLAGS) -o $@ $<
(3)       模式规则(pattern rules)
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<
(4)       通配符*
objects = *.o
objects := $(wildcard *.o)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
     
foo : $(objects)
     cc -o foo $(objects)
(5)       phony target(哑/假目标):不对应实际的文件,只是一个目标
.PHONY: clean  #如果这行不加,若当前目录下有一个clean文件,则make clean 没有动作
clean:         #这是phony target
       rm *.o temp
(6)       include filename:嵌套makefile,暂停当前makefile,转而读取指定的filename
-include filename:忽略找不到filename时的错误
(7)       控制语句:ifeq, ifneq

转载于:https://www.cnblogs.com/qq78292959/archive/2011/06/08/2076594.html

Linux下的shell与make相关推荐

  1. Linux下的shell脚本实战之用户创建

    Linux下的shell脚本实战之用户创建 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.该脚本提示用户创建用户名和密码 2.判断输入的用户名是 ...

  2. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件

    搜索热词 以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 #将tomcat中 ...

  3. linux下的shell和脚本

    1.各种Unix shell linux下的shell基本是从unix环境中的shell发展而来,贴一下wiki:其中我们常用的,可归类为Bourne Shell(/usr/bin/sh或/bin/s ...

  4. linux下的shell操作mysql

    (1)MySQL的启动 重启了一次服务器后,使用> mysql -u root -p登陆是出现下面的错误: ERROR 2002 (HY000): Can't connect to local ...

  5. linux下的shell脚本

    linux下的shell脚本 一.Shell概述 二.Shell 解析器 三.Shell脚本入门 1. 脚本格式 2. 第一个Shell脚本:helloworld 3. 第二个Shell脚本:多命令处 ...

  6. linux在指定行添加内容,linux下利用shell在指定的行添加内容的方法

    linux下利用shell在指定的行添加内容的方法 在linux的一些配置中总会要进行某个文件中的某行的操作,进行增加,修改,删除等操作. 而这里主要是进行的是指定的行添加数据的操作: 脚本如下: s ...

  7. Linux 减,linux下的shell运算(加、减、乘、除)

    linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...

  8. linux实现学生信息管理系统,Linux下基于shell脚本实现学生信息管理系统

    LINUX Linux操作系统 Linux下基于shell脚本实现学生信息管理系统 #该管理系统是参考两位博主(时间有点远了,我忘了,请博主看到后联系我)后自行修改添加的.登录过程还有很多不完善,我就 ...

  9. linux下的shell脚本,linux下的shell脚本的使用

    什么是shell? Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户.这种对话方式可是交互 ...

  10. Linux下的Shell工作原理

    为什么80%的码农都做不了架构师?>>>    Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序.它不 属于内核部分,而是在核心之外,以用户态方式运行.其基本功 ...

最新文章

  1. OpenCV(十七)边缘检测3 -- Canny算子(最优边缘检测)
  2. 使用 sched_setaffinity 将线程绑到CPU核上运行
  3. 第15届全国大学生智能汽车竞赛 人工智能挑战赛(百度)
  4. 如何花钱让2000元的月收入工资价值最大化?
  5. Resin的安全性ip限制
  6. 《金色梦乡》金句摘抄(六)
  7. windowsthinpc虚拟内存_windows thin pc如何开启windows功能
  8. oracle sum详解,oracle sum()聚合函数
  9. DML数据操作语言练习
  10. android下载图片服务,Android中的背景图片下载需要帮助吗?
  11. php集合与数组的区别,php数组和链表的区别总结
  12. BFC的作用以及原理介绍
  13. 向上取整和向下取整(ceil、round)
  14. ImportError: DLL load failed: 找不到指定的模块。
  15. [渝粤教育] 西南科技大学 英语语法2 在线考试复习资料
  16. compose yaml规则
  17. 51单片机c语言音乐代码天空之城,蜂鸣器版天空之城(示例代码)
  18. Vivado下载mcs到板子没反应
  19. SuperMap iDesktopX “电子地图坐标转换”—火星、百度坐标与常规坐标系之间的转换
  20. Android Q 上的Biometric生物识别之Fingerprint指纹识别流程

热门文章

  1. RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)
  2. 7.6 T1 深度优先搜索(dfs)
  3. java获取iPhone手机图片旋转角度处理
  4. php学习----运算符
  5. 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决
  6. Nodejs 了解web服务器
  7. vue路由参数改变,组件数据没重新更新问题
  8. jQuery源码研究分析学习笔记-jQuery.extend()、jQuery.fn.extend()(八)
  9. Vue「一」—— webpack 的基本使用及常用配置
  10. Linux驱动(6)--关于uboot