Bash脚本学习
目录:
1、Bash中的特殊字符:
2、变量、参数、引用:
3、循环:
4、内建命令与外部命令:
5、if条件判断:
6、vim的常用快捷键:
1、Bash中的特殊字符:
(1)#:行首以#开头的是注释,#!是用于指定当前脚本的解释器。
(2);:命令分隔符,可以在同一行上写两个或两个以上的命令。
(3);;:case 双分号;;终止case选项 esac
(4).:.等价于source命令,source命令用于在当前bash环境下读取并执行XXX.sh中的命令。
(5)“”:双引号会阻止string中大部分特殊的字符。
(6)‘’:单引号会阻止string中所有特殊字符的解释。
(7)/:文件名路径分隔符。在Linux中表示路径时,多个/和单个/是一样的。
(8)\:对单字符的引用机制。
(9)``:反引号中的命令会优先执行,然后将命令的输出赋值到一个变量中去。
(10)::冒号的作用:
①空命令,等价于NOP“NO Option”,也可以被认为与shell的内建命令true作用相同,它的(exit status)是0。
②在if/then中作占位符
③:在与>重定向操作符结合使用时,将会把一个文件清空,但是不会修改这个文件的权限。如果之前这个文件不存在,那么久创建这个文件。
④在/etc/passwd和$PATH变量中作分隔符
(11)?:在一个双括号结构中,?就是C语言中的三元操作符
(12)$:美元符号,作用:
①变量替换
②命令替换,和反引号相同。
(13)():小括号,作用:
①作为命令组,在括号中的命令,将作为一个子shell来运行。在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的。父进程(脚本本身)将不能读取在子进程中创建的变量。
(14){}:大括号,作用:
①文件名扩展,如cp t.{txt,bak},将t.txt文件复制到t.bak
②代码块,又称为内部组,这个结构实际上创建了一个匿名函数,然而与标准函数不同的是,在其中声明的变量,对于脚本其它部分的代码来说是可见的。
(15)[]:中括号,作用:
①用于存放条件测试表达式,[]是shell内建命令的一部分
②在一个array结构的上下文中,中括号用来引用数组中每个元素的编号。
(16)<>:尖括号,作用:
①test.sh > filename 重定向test.sh的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。
②test.sh &> filename 重定向 test.sh 的 stdout和 stderr到 filename 中。
③test.sh >& filename 重定向 test.sh 的 stdout 到 stderr 中。
④test.sh >> filename 把 test.sh 的输出追加到文件 filename 中。如果filename 不存在的话,将会被创建。
附注:
stdin:标准输入
stdout:标准输出
I/O重定向:默认情况下始终有3个“文件”处于打开状态,stdin(键盘),stdout(屏幕),stderr(错误消息输出到屏幕上),这三个文件和其他打开的文件都可以被重定向。
(17)|:管道,用于分析前边命令的输出,并将输出作为后边命令的输入。
(18)-:破折号,作用:
①在所有的命令内如果想使用选项参数,都要在前边加-
②用于重定向stdin或stdout
(19)~:表示home目录
2、变量、参数、引用:
(1)在对变量赋值的时候,等号前后一定不要有空格。“=”既可以用作条件测试操作,也可以用于赋值操作。同时在bash中==也可以作为条件判断。
(2)当在bash中,变量中有空格、tab之类的字符的时候,如果需要打印这些字符,需要用双引号进行引用。
(3)位置参数:从命令行传递到脚本的参数:
$0:脚本文件自身的名字
$1:第一个参数
$2:第二个参数
${10}:第10个参数
$#:表示执行脚本传入参数的个数。
9之后的未知参数就必须用大括号括起来了。
(4)IFS(Internal Field Separator):在Linux的shell中预设的分隔符,它是当前shell环境使用的默认定界字符串,如:
IFS=’\’
var=”abc\\d”
echo “$var”
则输出abc d,\字符被空白符替换了。
(5)内置变量:
①$BASH:显示bash的二进制程序文件的路径,即脚本解释器的路径
③$IFS:内部域分隔符,这个变量用来决定Bash在解释字符串时如何识别域,或者单词边界。
④$REPLY:当没有参数变量提供给read命令时,这个变量会作为默认变量提供给read命令。
(6)查看字符串长度:
mystring=asdghfhfjhgf
echo ${#mystring}
expr length $mystring
注意:对于array数组来说,$(#array)表示的是数组中第一个元素的长度。
(7)指定方式与说明:
${parameter-default} 如果变量 parameter 没被声明,那么就使用默认值。
${parameter:-default} 如果变量 parameter 没被设置,那么就使用默认值。
${parameter=default} 如果变量parameter没声明,那么就把它的值设为default。
${parameter:=default} 如果变量parameter没设置,那么就把它的值设为default。
${parameter+alt_value} 如果变量parameter被声明了,那么就使用alt_value,否则就使用null字符串。
${parameter:+alt_value} 如果变量parameter被设置了,那么就使用alt_value,否则就使用null字符串。
${parameter?err_msg} 如果parameter已经被声明,那么就使用设置的值,否则打印err_msg错误消息。
${parameter:?err_msg} 如果parameter已经被设置,那么就使用设置的值,否则打印err_msg错误消息。
(8)指定变量的类型:
declare -r:只读
-i:整型
-a:数组
-f:函数
-x:export
3、循环:
(1)for循环:for XX in YYYY do ZZZ done
(2)while循环:while [XXX] do YYY done
(3)until循环:until [XXX] do YYY done
(4)循环控制:break,continue
(5)case分支:case XXX in
YYYY1) ZZZ1;;
YYYY2) ZZZ2;;
esac
4、内建命令与外部命令:
(1)内建命令:由shell程序识别并在shell内部完成运行,通常在Linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是在bashy源码里的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。
(2)外部命令:Linux系统中的实用程序部分,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用至内存。可通过echo $PATH命令查看外部命令的存储路径。
(3)常用内建命令:
: 空,永远返回为true
. 从当前shell中执行操作
break 退出for、while、until或case语句
cd 改变到当前目录
continue 执行循环的下一步
echo 反馈信息到标准输出
eval 读取参数,执行结果命令
exec 执行命令,但不在当前shell
exit 退出当前shell
export 导出变量,使当前shell可利用它
pwd 显示当前目录
read 从标准输入读取一行文本
readonly 使变量只读
shift 命令行参数向左偏移一个
test 评估条件表达式
trap 当捕获信号时运行指定命令
ulimit 显示或设置shell资源
wait 等待直到子进程运行完毕
5、if条件判断:
(1)if/then结构用来判断命令列表的退出状态码是否为0,0表示成功,同时,不能直接使用0或者1作为判断条件,与其它大多数语言相反的true返回的是0,false返回的是1。
(2)if语句内判断参数:
①文件判断:
–b 当file存在并且是块文件(软盘、光驱等等)时返回真
-c 当file存在并且是字符文件(键盘、modem、声卡)时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是一般文件时返回真(即并不是目录或者设备文件)
-g 当由pathname指定的文件或目录存在并且设置了SGID(Set-group-id)位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 正在运行这个测试命令的用户是否具有读权限
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 正在运行这个测试命令的用户是否具有写权限
-x 正在运行这个测试命令的用户是否具有可执行权限
-o 判断你是否是文件的拥有者
②字符串判断:
str1 = str2:当两个串有相同内容、长度时为真
str1 != str2:当串str1和str2不等时为真
-n str1:当串的长度大于0时为真(串非空)
-z str1:当串的长度为0时为真(空串)
str1:当串str1为非空时为真
③数字判断:
int1 -eq int2:两数相等为真
int1 -ne int2:两数不等为真
int1 -gt int2:nt1大于int2为真
int1 -ge int2:int1大于等于int2为真
int1 -lt int2:int1小于int2为真
int1 -le int2:int1小于等于int2为真
(3)((...))和let...:如果运算结果为非0,该语句退出码为0,否则为1;
[[...]]:作为一个单独的语句并且会返回一个退出码
6、vim的常用快捷键:
(1)h,j,k,l:左,下,上,右
(2)w:光标移动至下一单词首位
(3)b:光标移动至当前单词首位,如果光标已经在当前单词首位,就移动到前一单词首位
(4)e:光标移动至当前单词末位
(5)gg:光标移动至文本首行
(6)Shift+g:光标移动至文本尾行
(7)50+Shift+g:光标移动至文本第50行
(8)o:在当前光标的下方插入新一行
(9)Shift+o: 在当前光标的上方插入新一行
(10)x:删除光标所在字符
(11)Shift+x:删除光标前的一个字符
(13)de:删除光标后的单词内容,同时被删除内容存于剪贴板上
(14)dw:删除光标后的单词内容以及之后的空格,同时被删除内容存于剪贴板上
(15)u:还原上一个操作
(16)yy:复制光标所在整行
(17)dd:剪切光标所在整行
(18)p:粘贴文本
(19):/关键字:全文查找该关键字,返回到查询结果的行首处。
(20)r + 字符:将光标上的字符替换为该字符
(21):s/关键字1/关键字2:光标所在行的第一个关键字1替换为关键字2。
(22):%s/关键字1/关键字2/:全文查找关键字1并替换为关键字2。
(23):3,20s/关键字1/关键字2/:在第3行和第20行之间进行搜索和替换。
(24):50s/关键字1/关键字2:表示仅仅在第50行进行搜索和替换。
(25):%s/关键字1/关键字2/gc:全文查找关键字1并替换为关键字2,替换时询问。可以选择y/n/a/q/l:y表示同意当前替换;n表示不同意当前替换;a表示替换当前和后面的并且不再确认;q表示立即结束替换操作;l表示把当前的替换后结束替换操作;