Linux命令行和shell脚本编程宝典 笔记
Linux命令行和Shell脚本编程宝典 阅读笔记。第一部分:Linux命令基础第二部分:shell脚本基础第三部分:shell脚本高级第四部分:shell种类及使用第五部分:实际使用
Linux命令行
第五章 使用Linux环境变量
设置环境变量
①设置本地环境变量
②设置全局环境变量 通过export将本地环境变量引导到全局环境中。
变量数组
将他们列出在圆括号中,各值以空格分隔。例如mytest=(one two three four five)
显示整个数组变量 使用星号通配符作为索引值。例如echo ${mytest[*]} (不能有空格)
Shell脚本的基础知识
第八章 基本脚本编译
反引号(`)
用于将shell输出赋值给变量(用反引号包围整个命令)
输出重定向
>
>>追加
输入重定向
<
<<内置输入重定向(命令行用)
数学计算(Bash shell只支持整数计算)
expr命令
特殊符号(如<,>)需要转义(\<,>)
bash中为变量指定数学表达式的值时,用$和[]把等式括起来
使用等号(=)为变量赋值时,等号两边不能有空格。
bash计算器(bc)
用scale=n指定结果的小数位数
bc中可以使用变量,不用加$,但在shell中使用bc则需要。
shell脚本中使用bc variable=’echo “options;expression” | bc’(其中options设置变量,如scale=4,expression为 数学表达式)
Linux退出状态码
第九章 使用结构化命令
if-then-else-fi
if-then-elif-then-fi
if test condition
then
commands
fi
同
if [ condition ]
then
commands
fi
复合条件检查
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
if-then高级特征
双方括号可以对字符串进行模式匹配。
case格式:
case $variable in
var1)
command
;;
var2)
command
;;
*)
command
;;
esac
第十章 更多结构化命令
从列表中读取值
for var in list
do
commands
done
从变量中读取列表
读取命令中的值
内部字段分隔符IFS(默认 空格、制表符、换行符)
限制bash shell看作是字段分隔符的字符IFS=$’\n’
使用通配符读取目录*
for file in /home/rich/test/*
C式for循环
for((variable assignment;condition;iteration process))
do
commands
done
while test command (或者while [ command ] )
do
other command
done
while command1
test command2 (由于是两条语句因此需要换行 或使用;隔开)
do
other command
done
until test command (由于是两条语句因此需要换行 或使用;隔开)
do
other command
done
until command1
test command2
do
other command
done
处理循环的输出
在done后使用管道或重定向循环输出结果。
例如done > output.txt
第十一章 处理用户输入
命令行参数
0为程序名称
1第一个参数$2第二个参数,以此类推。
basename只返回程序名称,不带路径
特殊的参数变量
$#
执行脚本时包含的命令行参数个数。(大括号中将$替换为!)
$*
将命令行提供的所有参数作为一个单词处理;
$@
将命令行中提供的所有参数作为同一个字符串中的多个单词处理,允许对其中的值进行迭代;
移位
Shift命令默认将每个参数变量左移一个位置,变量$1的值被丢弃。
Shift n n为偏移量
处理选项
简单选项(当做参数进行处理)
从参数中分离选项
Shell使用双破折号(——)指示选项列表的结束。
处理带值的选项
使用getopt命令
格式:getopt options optstring parameters
选项字符串optstring,定义了命令行中的有效选项字母,在每个需要参数值的选项字母后放置一个冒号
如果希望忽略错误消息,命令中使用-q选项
脚本中使用getopt命令:
Set命令的一个选项是双破折号,表示将命令行参数变量替换为set命令的命令行的值。
Set – getopt –q ab:c “$@”
(注意:是反引号)
更高级的getopts命令
命令格式getopts optstring variable
如果要禁止输出错误消息,使选项字符串以冒号开头。
参数被放入variable中。
环境变量OPTARG中包含需要选项的参数值;OPTIND的值表示getopts停止处理时在参数列表中的位置。
当getopts命令解析命令行选项时,会将打头的破折号去掉。
Getopts特性:①可以在参数之中包含空格,②选项字母和参数值中间可以没有空格;
getopt会将选项值和参数当做字符串处理,在使用数字作为选项值或参数时使用getopts更好一些。
获取用户输入:
基本读取read –p 指定提示
在read命令行中不指定变量时,将接收到的数据放置在环境变量REPLY中;
-t选项指定计数器,计数器满时,read命令返回非零退出状态。(if read –t 5 then/else fi)
默读(不希望输出显示)-s(数据显示,只是文本颜色与背景色相同)
读取文件
第十二章 显示数据
文件描述符(每个进程最多打开9个文件描述符,shell保留前三个)
重定向错误
2>
重定向错误和数据
2> file2 1> file1
错误和数据重定向到同一文件
&> file
脚本中重定向输出
临时重定向 重定向到某个文件描述符时,需在文件描述符编号钱添加&
永久重定向 exec通知shell在脚本执行起见重定向特定的文件描述符
脚本中重定向输入
exec 0< file
创建自己的重定向
使用exec命令为输出分配文件描exec 3>test3out echo “XXX” >&3
定向文件描exec 3>&1;exec 1>testout;exec 1>&3
入文件描exec 3<&0;exec 0<inputfile;exec 0<&3
取/写入文件描述符 exec 3<> inputoutputfile
关闭文件描述符 exec 3>&- (输入输出同时关闭)
列出开放文件描述符
lsof –p 制定进程(PID) $$为当前的PID
lsof –d 指定要显示的文件描述符编号 r读取w写入u读写
lsof –a 用来连接其他两个选项的结果
禁止命令输出
将STDERR重定向到空文件/dev/null
使用临时文件(只有所有者有读写权限)
当前文件夹创建临时文件mktemp +文件名模板(例如mktemp testing.XXXXXX)
在/tmp下创建临时文件 mktemp –t 文件名模板
创建临时目录 mktemp –d 文件夹模板
记录消息
输出同时发送到监视器和日志文件。 command | tree filename
如希望向文件添加数据 -a选项
第十三章 脚本控制
处理信号
捕捉信号 保护该信号不被shell处理,并在本地处理它
trap commands signals
捕获脚本退出
trap commands EXIT
移除捕获
trap – EXIT
以后台模式运行脚本
1、以命令行界面以后台模式运行shell脚本,在命令后加上一个&符号
如果终端退出,后台进程也会退出。
在不使用控制台的情况下运行脚本
nohup命令运行另一个命令阻塞发送到进程的任何SIGHUP信号。防止在退出终端会话时退出进程。
nohup命令格式:nohup command &
因为nohup命令将进程和终端断开,所以进程没有STDOUT和STDERR输出链接。为接收命令生成的任何输出,nohup将STDOUT和STDERR消息重定向到nohup.out文件。
作业控制
查看作业 jobs
重新启动停止的作业
以后台模式重新启动作业bg 作业号
以前台模式重新启动作业fg 作业号
调整调度优先级
nice命令 启动命令时设置他的调度优先级
格式:nice –n 正整数 (不许普通用户增加优先级)
renice命令 修改已运行的命令优先级
给定时间运行脚本
at 指定Linux系统运行脚本的时间
命令格式 at [-f filename] time
有26种不同的作业队列可用于不同的优先级水平,默认所有at作业都提交到作业队列a,即最高优先级队列,如希望以较低的优先级运行作业,可以使用-q参数指定字母。
输出STDOUT和STDERR通过邮件发送给用户。
列出排队的作业 atq
移除作业 atrm 作业号
batch命令 安排脚本在系统使用率低时运行
检查Linux系统当前的平均负载水平,如果低于0.8,将运行任何在作业队列中等待的作业。
命令格式: batch –f filename time
cron调度定期脚本
从头开始
让脚本在Linux一启动或用户启动新的bash shell会话时便自动运行。
系统启动时启动
随新shell一起启动。
shell在由于新用户登录而运行新的shell时运行.bash_profile
shell在每次启动新shell时运行.bashrc文件
高级shell脚本编程
第十四章 创建函数
函数是被赋予名称的脚本代码块。
创建函数(大括号“{”不能与函数名连在一起)
① function name {
commands
}
② name() {
commands
}
使用函数
在脚本中指定函数名即可。函数定义必须在使用之前。
返回值
以退出状态作为返回值。退出状态有三种生成方式。
默认退出状态 最后一条命令返回的退出状态。
使用return命令 以特定退出状态退出函数。0-255
使用函数输出 捕获函数输出(echo输出)存放到shell变量中。例如result=funcname
在函数中使用变量
向函数中传递参数(使用标准参数环境变量来表示命令行传递给函数的参数)
在函数中处理变量 脚本中定义的变量可以在函数中使用并修改。(危险)
在函数中使用local声明变量,外部变量不受影响。
函数中使用数组
向函数传递数组 不能将数组变量作为单个参数传递。如func $arrname
(解决方案:将数组变量拆分为单个元素,函数内部重组为数组变量)例如:
function testit {
local newarray
newarray=(echo “$@”
)
}
myarray=(1 2 3 4 5)
testit ${myarray[*]}
从函数返回数组(类似于向函数传递数组)
函数递归
库文件(将函数独立出来,供多个脚本使用) 关键是source命令(别名 点操作符“.”)例如: . ./myfuncs (注意 . 与后面文件的空格)
在命令行中使用函数
在命令行中创建函数
(存入环境变量中)使用unset删除 –f仅删除函数-v仅删除变量
将函数定义在一行命令中
使用多行命令定义函数
在.bashrc文件中定义函数
第十五章 与脚本用户的更多交互
创建文本菜单
创建菜单布局
clear清除文本;
echo –e输出特殊字符;
创建菜单函数
添加菜单逻辑
将其全部组合在一起
使用select命令
添加颜色
ANSI转义码(以控制序列指示器CSI)开头,后跟表示要在显示器上执行的操作的数据。
要控制显示格式,必须使用选择图形再现(SGR)转义码,格式SCIn[;k]m
显示ANSI转义码
使用echo将ANSI转义码发送到终端会话。CSI是一个两字符序列(ESC的ASCII值+左方括号字符)ESC的ASCII值通过Ctrl-V跟Esc键输入
制作窗口
dialog软件包
命令格式dialog –widget parameters(widget小部件名称,parameters窗口大小及文本)
选择OK或yes按钮,dialog返回0退出状态;选择Cancel或No按钮,dialog返回1退出状态;ESC退出,dialog返回255退出状态。
输出形式①使用STDERR(接收输入值);②使用退出代码状态(接收选项);
使用—title指定小部件的标题
dialog –msgbox text height width
dialog –yesno text height width
dialog –inputbox text height width
dialog –textbox filename height width
dialog –menu title height width itemcount(菜单项数) items(菜单项)
dialog –fselect dir(窗口使用的起始位置) height width
X Windows图形小部件(只能在图形界面运行)
KDE环境
kdialog软件包(不是包含在终端模拟器对话中)结果发送到STDOUT
命令格式:kdialog display-options window-options(部件类型) arguments
GNOME环境
gdialog包和zenity包
参数在命令行上另起一行输入,而不作为选项参数。
第十六章 sed和gawk
sed编辑器,称为流编辑器。
命令格式:sed options script file
1、 在命令行中定义编辑器命令
通过管道将数据传送给sed 例:echo “This is a test” | sed ‘s/test/big test/’
2、 在命令行中使用多个编辑器命令 使用-e选项,多个命令用分号分隔,命令结尾与分号间不能有空格
sed –e ‘s/brown/green/; s/dog/cat/’ data1
3、 从文件读取编辑器命令
gawk程序
提供了一种编程语言而不仅仅是编辑器命令行。
1、命令格式: gawk options program file
2、自命令行读取程序脚本
gawk程序脚本由左大括号和右大括号定义
使用Ctrl-D结束gawk程序
3、 数据字段变量
0表示整行文本
1 表示文本行中第一个数据字段
$n 表示文本行中第n个数据字段
gawk默认字段分隔符是任意空白字符(如制表符和空格) -F指定字段分隔符,如-F:
4、 使用多个命令
多个命令之间用分号“;”分隔
5、 从文件读取程序
-f script
6、 在处理数据之前运行gawk脚本
gawk ‘BEGIN {commands}’
如果有正常处理脚本程序,使用另一脚本片段定义。例如gawk ‘BEGIN {command1} {commands}’
7、 在处理数据之后运行gawk脚本
gawk ‘END {commands}’
sed编辑器扩展
1、 更多替换选项
s/pattern/replacement/flags
flags:
数字(新文本替换的模式)替换第几次出现的内容
g(一行全部替换)
p(打印原始行的内容) -n禁止sed编辑器的输出
w file(将输出保存到指定的文件中)
由于正斜杠/用作定界符,如果正斜杠出现在模式文本中必须使用反斜杠转义。
sed允许为替换命令中定界符选择一个不同的字符。如sed ‘s!/bin/bash!/bin/csh!’
2、 sed使用范围
如仅想将命令应用于某特定行,必须使用行寻址。
格式:[address]command 或
address{
command1
command2
}
数字式行寻址:①单行行号;(尾行$)②起始行号、逗号+结束行号
文本模式筛选器
格式:/pattern/command
3、 删除行
sed ‘d
4、 插入和附加文本
插入命令(i)在指定行之前添加新的一行
附加命令(a)在指定行之后添加新的一行
格式:sed ‘[address]command\ 如:
5、 更改行
c命令
6、 变换命令
y命令 对单个字符进行操作。inchars和outchars一对一映射,如果inchars和outchars长度不同,sed生成错误消息。
7、 打印命令
① 打印行p,与-n搭配使用 sed –n ‘2,$p’
② 打印行号=命令 sed ‘=’
③ 列出行l(小写的L) 允许打印数据流中的文本和不可打印的ASCII字符
8、 文件与sed
写文件w用于将文本行写入文件 格式:[address]w filename
例:sed –n ‘/IN/w INcustomers’ data10
从文件读取数据r (插入独立文件中的数据)不能使用地址范围
第十七章 正则表达式
正则表达式引擎
POSIX基本正则表达式(BRE)引擎;
POSIX扩展正则表达式(ERE)引擎;
一、 特殊字符类
扩展正则表达式(ERE)
gawk能识别ERE,sed不能。
使用大括号——指定对可重复的正则表达式的限制。(必须指定—re-interval命令行选项)
管道符号(检查两个或多个模式)(将两边的内容各自作为整体,而非单字符)
第十八章 高级sed编程
多行命令
①N在数据流中添加下一行以创建用于处理的多行组。
(如果待搜索内容在末尾则存在问题,解决方案:将单行命令移到N命令前)
②D删除多行组中的单个行
在使用N找到两行后只想删除第一行而非两行都删除
③P打印多行组中的单个行
只打印模式空间的第一行
保留空间(启动sed时保留空间包含一个空行)
模式空间是一个活动的缓冲区。
否定命令
!用于否定命令。在通常命令被激活的地方不激活命令
更改命令流
1、 分支
格式:[address]b [label]
标签在后面
标签在前面
2、 测试
不是基于地址跳转到标签,而是基于替换命令的结果跳转到标签。
格式:[address]t [label]
匹配替换成功后,测试命令跳过后续的替换命令。
模式替换
与号
用于表示替换命令中的匹配模式。无论什么文本匹配上定义的模式,都可以使用与号在替换模式中调用它。(批注:相当于正则中调用分组1、2)
替换个别单词
圆括号定义替换模式中的子字符串元素,替换字符由反斜杠和数字组成。(圆括号必须转义)
脚本中使用sed
sed包装器
重定向sed输出:使用反引号(`)
创建sed工具
- 对可能有空行的文件使用双倍行距
使用sed ‘G’ filename时有空行的位置出现3个空行,解决办法是从数据流中删除空行。sed ‘/^ /d; !G’ filename - 显示行号
sed ‘=’ filename | sed ‘N; s/\n/ /’ 通过‘=‘显示行号后将其放在同一行
打印最后几行
sed ‘{
:start
$q
N
12,$D
b start
}’ filename
- 删除行
删除连续空行 /./,/^ /!d(注释:非空行加空行不删,其他就是连续空行)删除开头空行/./, !d (注释:第一个非空行到最后不删,其他都是开头空行)
删除结尾空行
sed ‘{
:start
/^\n*$/{$d; N; b start }
}’
第十九章 高级gawk编程
使用变量
内置变量
用户定义变量
使用“=”赋值,输出时不带“$”符号。赋值可以在脚本中赋值,也可以在命令行中赋值。例:
(数学运算符^等同于**,求幂运算)
使用数组(关联数组)
递归时使用for(key in array)
删除数组元素delete array[“index”]
使用模式
1、正则表达式 在使用正则表达式时,正则表达式必须出现在程序脚本的左括号之前。
例如:`gawk ‘BEGIN{FS=”,”} /11/{print $1}’ data1`
2、匹配操作符 允许限制正则表达式匹配记录中的特定数据字段。(波浪线~)需要指定匹配操作符,数据字段变量,匹配的正则表达式。
例如:`gawk ‘BEGIN{FS=”,”} $2 ~ /^data/{print $0}’ data1` 匹配出第二个字段以data开头字符串
3、数学表达式 ==,<=,<,>=,>
例如 `gawk –F: ‘$4 == 0{print $1}’ /etc/passwd`
四、 格式化命令
1、 if语句
2、 while语句
3、 do-while语句
4、 for语句
五、 格式化打印
printf命令 printf “format string”,var1,var2……
六、 内置函数
1、 数学函数
2、 字符串函数
3、 时间函数
七、 用户自定义函数
1、 关键字function
2、 使用自己的函数 单独出现在定义的任何代码部分之前(包括BEGIN部分)
3、 创建函数库 函数合并到单独的库文件中 使用-f命令将函数库与gawk组合使用。
可选的Linux shell
第二十章 ashshell
第二十一章 tcsh
tcsh shell使用命令行参数、默认文件、环境变量和内置命令来定义shell操作环境。
tcsh文件: 登录文件、shell启动文件、退出文件
登录文件 /etc/csh.login /etc/csh/login
启动文件 /etc/csh.cshrc $HOME/.cshrc $HOME/.tcshrc
退出文件 /etc/csh.logout $HOME/.logout
tcsh shell包含两种环境变量 shell变量、系统环境变量
第二十二章 Kornshell
ksh88和ksh93
ksh93包括 命令行参数、默认文件、环境变量、内置命令
默认文件 /etc/profile $HOME/.profile
ksh93环境变量特性:
随机数 $RANDOM
定义变量类型
复合变量
特殊变量下标
在ksh93中编写脚本
- 执行数学运算 let命令、双圆括号、
- 结构化命令
- 命令重定向 variable = $( commond )
- 规程函数 get获取函数变量的值,set设置函数变量的值,unset重置函数变量的值。使用.sh.value变量
第二十三章 zsh shell
一、zsh shell的组成部分
1、 shell选项
选项类型:
2、 zsh shell文件
shell启动文件 /etc/zshenv $HOME/.zshenv
登录文件 /etc/zlogin /etc/zprofile $HOME/.zlogin $HOME/.zprofile
交互式文件 /etc/zshrc $HOME/.zshrc
退出文件 /etc/zlogout $HOME/.zlogout
3、 环境变量
支持typeset命令,在变量使用前声明变量的属性
数值数组起始索引值为1。
声明关联数组 variable=( key1 value1 key2 value2 )
4、 内置命令
核心内置命令
添加模块
查看模块 zmodload不加任何命令行参数
载入模块 zmodload 模块名
删除模块 zmodload –u 模块名
二、使用zsh编写脚本
1、数学运算
执行计算 let命令; 双圆括号参数
数学函数
2、结构化命令
3、函数 使用function关键字; 定义带圆括号的函数名
可以将函数放在单独文件中,zsh shell通过fpath环境变量查找函数,可将函数文件放在该路径下任意目录中。
zsh shell解析函数前,必须使用autoload命令,将函数载入内存 格式:autoload filename
高级主题
第二十四章 使用数据库
发送命令:单条命令
多条命令
将输出赋值给变量
使用格式化标签
mysql dbname –u username –X –e ‘commond’
第二十五章 使用web
1、 Lynx程序
2、 cURL程序
3、 zsh的TCP模块
第二十六章 使用电子邮件
第二十七章 管理员使用的shell脚本
1、 监控系统统计信息
监控磁盘空闲空间
谁在霸占磁盘资源
监视CPU和内存使用情况
使用uptime和vmstat命令
2、 执行备份
更多推荐
所有评论(0)