您好,欢迎访问三七文档
bash编程攻略 ASIAINFO 谢楠 课程⺫⽬目标 掌握基本shell语法和命令 独⽴立编写简单shell脚本 学以致⽤用,积累沉淀 shell能做⼀一些基本的命令组合? 第⼀一次亲密接触 实⽤用⼯工具推荐 优秀作品赏析 玩转SHELL命令 内容安排 SHELL前世今⽣生 我爱你 前世今⽣生 Unix的第⼀一个版本由KenThompson、DennisRitchie和DouglasMcIlroy于1969在AT&T开发完成 1970年是Unix元年 前世今⽣生 前世今⽣生 前世今⽣生 前世今⽣生 前世今⽣生 讲解unix和shell历史的⺫⽬目的是什么? 到底什么是shell • Shell是⼀一种具备特殊功能的程序,它是介于使⽤用者和UNIX/Linux操作系统之核⼼心程序(kernel)间的⼀一个接⼝口。 • Shell的⼀一个重要特性它是⼀一种解释型的程序设计语⾔言。 • 本质上shell 脚本是命令⾏行命令简单的组合到⼀一个⽂文件⾥里⾯面执⾏行。 shell类型 • 交互式 ü 从命令⾏行启动 ü 登陆系统 ü 环境变量使⽤用.bash_profile⽂文件(以bash为例) • ⾮非交互式 ü 以脚本⽅方式启动 ü 继承⽗父shell环境变量 当前流⾏行shell Ø sh BourneShell Ø ksh KornShell Ø csh,tcsh CShell Ø bashBourne-AgainShell 该选择哪个shell? shell有两种主要语法类型:B和C,彼此不兼容, B家族:shkshbashpshzsh C家族:cshtcsh 其中:bash和zsh在不同程度上⽀支持csh的语法 Shell类别 易学性 交互性 效率 可移植性 os Bourne(sh) 容易 较差 好 好 solaris Korn(ksh) 较难 好 较好 较好 aix BourneAgain(bash) 难 好 好 较好 linux POSIX(psh) 较难 好 较好 好 hp-ux C(csh) 较难 较好 较差 差 freebsd TC(tcsh) 难 较好 较差 差 ⽆无 Z(zsh) 难 好 ⼀一般 差 ⽆无 ✔ 我在谁? 如何确认当前使⽤用的是哪个shell? echo$SHELL chsh 如何改变当前使⽤用的默认shell? 如何确认当前可以使⽤用哪些shell? /etc/shells shell安全?shell不安全? 亲,有的时候你希望你的shell代码保密,最好运⾏行时也是保密的? 然后呢? shell是解释性脚本,明⽂文的,任何有读权限的⼈人都能查看? 是的,这次你说的没错 第⼀一次亲密接触 实⽤用⼯工具推荐 优秀作品赏析 玩转SHELL命令 内容安排 SHELL前世今⽣生 让你的环境充满个性化 • 每种shell都⽀支持⼀一些个性化要素 – prompt – alias – color – path – charset • 个性化信息定义在启动⽂文件中 – 不同shell启动⽂文件不同 – 启动⽂文件在操作系统⽤用户login和logout的时候⽣生效 启动⽂文件 Ø sh,ksh: /etc/profile (out-of-the-boxloginshellsettings) ~/.profile (loginshellusercustomization) Ø bash: /etc/profile (out-of-the-boxloginshellsettings) ~/.bash_profile (loginshellusercustomization) ~/.bashrc (non-loginshellusercustomization) ~/.bash_logout (userexitsfrominteractiveloginshell) /etc/bashrc (non-loginshellcustomization) Ø csh/tcsh: /etc/login (out-of-the-boxloginshellsettings) ~/.login (loginshellusercustomizations) ~/.cshrc (non-loginshellusercustomizations) ~/.logout (userexitsfrominteractiveloginshell) 你了解这些变量的⽤用途吗 USER:当前⽤用户名 UID:当前⽤用户的标识符,取值是由数字构成的字符串 MAIL:当前⽤用户的邮件存放⺫⽬目录 HOME:⽤用于保存注册⺫⽬目录的完全路径名 HOSTNAME:主机名 TERM:终端的类型 LANG:和语⾔言相关的环境变量 HISTSIZE:保存历史命令记录的条数 SHELL:当前⽤用户⽤用的是哪种Shell 查看环境变量? set和env的区别 你了解这些变量的⽤用途吗 PATH:⽤用于保存⽤用冒号分隔的⺫⽬目录路径名,shell将按PATH变量中给出的顺序搜索这些⺫⽬目录,找到的第⼀一个与命令名称⼀一致的可执⾏行⽂文件将被执⾏行 LD_LIBRARY_PATH:库查找路径 PWD:当前⼯工作⺫⽬目录的绝对路径名,该变量的取值随cd命令的使⽤用⽽而变化 OLDPWD:上次⼯工作⺫⽬目录的绝对路径名 PS1:主提⽰示符,在特权⽤用户下,缺省的主提⽰示符是“#”,在普通⽤用户下,缺省的主提⽰示符是“$” PS2:在shell接收⽤用户输⼊入命令的过程中,如果⽤用户在输⼊入⾏行的末尾输⼊入“\”然后回⻋车,或者当⽤用户按回⻋车键时shell判断出⽤用户输⼊入的命令没有结束时,显⽰示这个辅助提⽰示符,提⽰示⽤用户继续输⼊入命令的其余部分,缺省的辅助提⽰示符是“” 你了解这些特殊键的⽤用途吗 Ctrl-U=删除⼀一整⾏行 Ctrl-H=删除前⼀一个字符 Ctrl-C=中断当前任务 Ctrl-\=强制退出当前任务 Ctrl-D=退出当前session Ctrl-Z=挂起当前进程 Ctrl-P=将上⼀一个命令设置为当前命令Ctrl-N=将下⼀一个命令设置为当前命令 TAB=⽂文件名字补⻬齐 3W which whereis whatis 你最好的朋友 %mancommand(例如%manls) – showsinformationaboutthecommand – usuallyspaceorEnterformoreinformation – qtoquit – %manman shell的执⾏行⽅方式 Ø 给脚本加上执⾏行权限例如chmodu+xa.sh,使⽤用全路径执⾏行 Ø 没有执⾏行权限的脚本采⽤用bash ./a.sh⽅方式执⾏行 Ø 不论有没有执⾏行权限basha.sh Ø source /tmp/test/a.sh模式执⾏行 Ø ./tmp/test/a.sh模式执⾏行 执⾏行⽅方式思考 五种shell执⾏行⽅方式的区别? 总结回顾 unix和shell的历史 为什么选择bash作为本次课程重点 shell的初始环境是什么样⼦子的 shell的主要执⾏行⽅方式 第⼀一次亲密接触 实⽤用⼯工具推荐 优秀作品赏析 玩转SHELL命令 内容安排 SHELL前世今⽣生 关于变量 本地变量:⽤用户⾃自定义的变量。 环境变量:⽤用于所有⽤用户变量,⽤用于⽤用户进程前,必须⽤用export命令导出。 位置变量:$0(脚本名),$1-$9:脚本参数。 特定变量:脚本运⾏行时的⼀一些相关信息。 $# 传递到脚本的参数个数 $* 传递到脚本的参数,与位置变量不同,此选项参数可超过9个 $$ 脚本运⾏行时当前进程的ID号,常⽤用作临时变量的后缀,如haison.$$ $! 后台运⾏行的(&)最后⼀一个进程的ID号 $@ 与$#相同,使⽤用时加引号,并在引号中返回参数个数 $- 上⼀一个命令的最后⼀一个参数 $? 最后命令的退出状态,0表⽰示没有错误,其他任何值表明有错误 关于变量 echoWelcometoBash! echo“WelcometoBash!” echo‘WelcometoBash!’ echo`WelcometoBash!` Var=“WelcometoBash” echo$Var echo‘$Var’ echo“$Var” 还有什么输出⽅方式? 有什么区别? echo${Var} 还有输出⽅方式吗? 关于变量 cat/proc/$PID/envrion 如何知道程序使⽤用的真实环境变量? 下⾯面两种书写⽅方式的区别? var=value var=value 当变量为空时,需要缺省值或者退出,该怎么做? ifelse判定,没错,可是如果有10个变量,累吗? 关于变量----进阶 替换的形式有四种,列举如下: ${var:-word}表⽰示如果var已经被赋值,则取它的值,否则取word的值,但var不改变 ${var:=word}表⽰示如果var已经被赋值,则取它的值,否则取word的值,同时将word赋给var ${var:+word}表⽰示如果var已经被赋值,则取它的值,否则var变量置为空 ${var:?error}表⽰示如果var已经被赋值,则取它的值,否则显⽰示错误并退出 关于变量 Shell变量只有⼀一种数据类型:字符串 整形计算 let (()) [] expr 浮点计算 bc 关于变量 经常需要变量的⼀一部分,还在为substr的使⽤用烦恼? 怎么替换变量部分内容? file=/dir1/dir2/dir3/my.file.txt怎么获取文件名?怎么获取文件类型后缀?sed,当然可以 还是sed,ok 真的只能⽤用sed吗?和sed死磕到底 关于条件测试 expression string1=string2 string1!=string2 string -nstring -zstring 满⾜足下列条件时返回真值 string1与string2相同 string1与string2不相同 string不为空串 string不为空串 string为空串 关于条件测试 expression int1-eqint2 int1-geint2 int1-gtint2 int1-leint2 int1-ltint2 满⾜足下列条件时返回真值 两者为数值且int1等于int2 两者为数值且int1⼤大于或等于int2 两者为数值且int1⼤大于int2 两者为数值且int1⼩小于或等于int2 两者为数值且int1⼩小于int2 int1-neint2 两者为数值且int1不等于int2 关于条件测试 expression -rFileName -wFileName -xFileName -sFileName -dFileName 满⾜足下列条件时返回真值 FileName存在且为⽤用户可读 FileName存在且为⽤用户可写 FileName存在且为⽤用户可执⾏行 FileName存在且其⻓长度⼤大于0 FileName为⼀一个⺫⽬目录 -fFileName FileName为⼀一个普通⽂文件 关于条件测试 expression !expr expr1–aexpr2 expr1–oexpr2 \(expr\) 满⾜足下列条件时返回真值 expr返回值为假(Not) expr1和expr2同时为真(And) expr1为真或expr2为真(Or) expr为真时 [注意]左右括号前要加转义符\ 让shell丰富多彩 关于别名 alias⽤用来简化复杂命令,例如: aliasgoagent=‘python/Users/nogfw/goagent/local/proxy.py’ 有时候别名会引起冲突? unalias掉,没错,可是⻢马上我还想⽤用alias的⽅方便啊? 当前⽤用的ls是alias过的吗? alias|gre
本文标题:bash编程攻略
链接地址:https://www.777doc.com/doc-6124304 .html