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(“\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按照这些说明自动地维护这些模块。

在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

Linux下的shell与make的更多相关文章

  1. linux下的shell运算(加、减、乘、除)

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

  2. [转] 关于linux下通过shell命令(自动)修改用户密码

    关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自 ...

  3. linux下的shell和脚本

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

  4. Linux下添加shell脚本使得nginx日志每天定时切割压缩

    Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常 ...

  5. Linux下使Shell 命令脱离终端在后台运行

    --Linux下使Shell 命令脱离终端在后台运行------------------------------------2014/02/14你是否遇到过这样的情况:从终端软件登录远程的Linux主 ...

  6. linux下实现shell脚本自动连接mongodb数据库并创建索引

    在linux下创建shell脚本

  7. linux下的shell操作mysql

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

  8. linux下的shell运算(加、减、乘、除

    linux下的shell运算(加.减.乘.除 摘自:https://blog.csdn.net/hxpjava1/article/details/80719112 2018年06月17日 16:03: ...

  9. 2019.11.13课堂实验之用Linux下的shell脚本完成两文本交替输出

    有两个文本如下,实际中并不知道两文本各有多少行: 文本1.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ccccccccccccccccccccccccccc ...

随机推荐

  1. http认证中的nonce与timestamp解释

    Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端:客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5.SHA1等等),然后将这个加密后的字符串和用户 ...

  2. hbase知识

    HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统 HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据. HBASE ...

  3. Centos7 JDK安装过程中 解决java -version 报错: bash: /home/jdk1.8.0_161/bin/java: Permission denied

    1.执行Linux命令 -----vim /etc/profile  编辑profile  文件,在里面添加: #set java enviroment JAVA_HOME=/opt/JavaHome ...

  4. Highcharts 配置语法

    Highcharts 配置语法 本章节我们将为大家介绍使用 Highcharts 生成图表的一些配置. 第一步:创建 HTML 页面 创建一个 HTML 页面,引入 jQuery 和 Highchar ...

  5. Spring注解之BeanPostProcessor与InitializingBean

    /*** BeanPostProcessor 为每个bean实例化时提供个性化的修改,做些包装等*/ package org.springframework.beans.factory.config; ...

  6. java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().

    java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close(). java.lang.Exception: DEBUG ...

  7. C++ Leetcode Median of Two Sorted Arrays

    坚持每天刷一道题的小可爱还没有疯,依旧很可爱! 题目:There are two sorted arrays nums1 and nums2 of size m and n respectively. ...

  8. Greys Java在线问题诊断工具

    摘要: 线上系统为何经常出错?数据库为何屡遭黑手?业务调用为何频频失败?连环异常堆栈案,究竟是那次调用所为? 数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧? 走进科学带你了解Gre ...

  9. windows中mysql5.7保存emoji表情

    1.找到my.ini文件,修改一下配置: [client] default-character-set=utf8mb4 [mysqld] character-set-client-handshake ...

  10. 002-linux——控制台的使用:

    1.桌面控制台: 2.字符控制台: .默认6个字符控制台. .独立运行 互不影响 .多用户  多任务 tty-控制台的使用: .开始进入的是图形图面:tty1 就是图形界面. .图形界面切换到字符界面 ...