Linux程序设计 第1章入门 第2章shell程序设计

来源:互联网 发布:wayv 源码 编辑:程序博客网 时间:2024/06/17 11:49
#1 入门


Linux 程序  可执行程序  脚本文件
Linux 使用/分隔文件中的目录名  windows 使用\


 gcc  -c test.cpp  
 输出*.o 文件  中间文件


 创建并使用库文件,
 创建归档文件,并将文件添加进去。


 静态库缺点:
当你运行许多程序时,他们来自同一个函数库的函数时,内存中就会有一个函数的多个副本,程序文件的自身也有多份同样的副本。消耗大量的内存和磁盘空间。


静态函数库  linux: lib.a  windows:LIB.LIB
共享库  lib.so  系统仅保留一份副本共多个程序同时使用。磁盘上仅保留一份。




#2 shell 程序设计
shell 效率不高  shell脚本不适合 完成时间紧迫和处理器忙碌的任务


shell 是用户和操作系统的接口
< > 进行输入 输出的重定向
| 数据的管道传递
$(..)  获取子进程的输出


 将错误输出重定向


 cmd 2>log


将标准输出和标准错误输出重定向到不同文件中
cmd   > 1.txt 2> 2.txt
如果想将两组输出重定向到同一个文件中,使用>&


cmd   > 1.txt 2>&   #含义将错误输出重定向到同一个文件
管道命令|
Linux通过管道连接的进程可以同时进行,并且随着数据流在他们间的传递自动协调


进程连接的数目没有限制


shell中可以使用*匹配一个字符串
?匹配单个字符
{*,*} 可以使用在部分shell中进行扩展,选择字符的集合


shell 退出码
exit 0
相信它会被其他脚本所使用。
0表示执行成功


如果字符串中包含空格一定要将他用引号引起来


在从终端读取一个变量时,一般不需要引号。


字符串通常放在双引号中,既防止变量被空白字符分开,同时允许扩展。


条件语句  test [] 的使用


比较三类
字符串比较  =  相等  != 不相等   -n 不为空则为真  -z 空串
算数比较  -eq -ne  -gt -ge -lt  -le !表达式为假则为真
文件条件测试
-f 是普通文件,同时常用于判断文件是否存在
-d 目录文件
-g  文件的set-group-id 位置是否被设置
-r 文件可读
-s 文件大小不为0
-u 文件的set-user-id 被设置为真
-w 可以写
-x 可以执行




if语句
if conditon
then
statement;
else
statement;
fi


缩写形式  if condition ;then


if condition 
then
S;
elif  condition; then
S;
else
s;
fi
fi 就是if  反过来写




for 循环
for var in s1 s2 s3
do
echo $var;
done




while 语句


while condition 
do
statement;
done


 
until语句


until condition
do 
statement;
done




#case 语句
case var in
yes| y| Yes)  echo "hello";;
[nN]*)        echo "h2";;
*)      echo "h1";;
esac
提示:esac就是case反过来写。


AND 列表 
s && s && s
OR 列表
S || S || S || S




#函数使用
一个脚本程序比执行另一个函数慢很多。


函数声明
function_name () {
statement
}


必须在调用一个函数前对他进行定义
当一个函数被执行时 $*  $@  S# $1 $2 会被替换为当前函数的,参数执行完毕后,参数会恢复为当前值。




shell的环境变量说明
$HOME 当前用户的目录
$PATH 搜索命令的目录列表
$IFS  输入分隔符
$0    shell脚本的名字
$#    参数的个数
$$    脚本的进程号
$1    第一个参数


$*    所有的参数,使用IFS中的第一个字符分开
$@    使用空格分开所有参数




可以使用local关键字在函数中声明变量
return 返回数字值
局部变量和全局变量名字相同,前者覆盖后者。仅限在函数的作用范围内


result="$fun()"  得到函数结果


 #!/bin/bash
 
 f() {
 
         echo "hello"
         return 1;
 }
 f
 result="$(f)";
 echo "得到的结果";
 echo $result
显示的结果
hello
得到的结果
hello


结果显示
函数里如果没有指定返回值,返回的就是最后一条命令的退出码


内置命令:
#break 命令,默认只跳出1层循环
#: 命令,是一个空命令,相当于true的别名,由于它是内置命令
执行比true块,但他的可读性差。
while : 实现了一个无线循环,代替了更常见的while true。
: 被用于在变量的条件设置中
: ${var:=true}
如果没有:,shell会把$var 当做一条命令来处理


#continue  语句


#.命令  用于在当前shell中执行命令
默认情况下,shell脚本会在一个新创建的环境中执行,则脚本程序对环境变量做的修改都会丢失
点命令允许执行的的脚本改变当前环境。


echo -n "test"  去掉换行符


#eval  命令允许你对参数进行求值   是shell的内置命令
eval 命令十分有用,它允许代码被随时生成和运行、


#exec 命令有两种不同的用法
典型用法将当前的shell替换为一个不同的程序
例如:
exec wall "Thanks for all the fish"
脚本中命令使用wall 命令替换当前的shell
脚本中exec后面的命令后面的代码就不会执行,因为执行这个脚本的shell已经不存在了
第二种用法 
exec 3< afile




退出码1-125 是脚本中可以使用的错误代码,其余的代码具有保留含义。
126 文件不可执行
127 命令未找到
128及以上出现了一个信号


#export 命令 将作为它参数的变量到出到shell中
#expr 命令 将它的参数当做一个表达式求值
常见用法进行简单的数学运算
x=`export $x+1`
反引号`` 使x取值为命令的结果 expr $x+1 的结果  
可以使用 $() 替换反引号`` 
x=$(expr $x=1 )
#printf 命令
主要限制,不支持浮点数
shell中所有的算术运算都是按照整数进行计算


#return 命令 使函数返回 ,return命令有一个数值参数,
#set 命令 为shell设置参数变量




#shift 命令爸所有的参数左移一个位置,使$3 变成 $2
$1 被丢弃 $0 不变
trap 命令指定在接收到信号后将要 采取的行动


#unset命令从环境中删除变量和函数


find 命令在文件中搜索文件,使用grep在文件中搜索字符串
grep 通用正则表达式解析器
General Regular Expression Parser


命令的执行
$(..)


`..`
两种方法


算术的扩展
x=$(($x+1))
与命令执行的单个括号不同,该命令使用两个括号,用于算术运算。


#here文档
shell脚本程序中向一条命令传输的一种特殊办法就是使用here文档。

















































































































0 0
原创粉丝点击