您的位置:首页 > 运维架构 > Shell

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

2014-12-19 23:01 218 查看
#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文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: