#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文档。
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文档。