Shell编程-基础

Posted 人塞不能怨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程-基础相关的知识,希望对你有一定的参考价值。

Shell编程-从基础到进阶

可执行文件

#创建并编辑脚本
touch cha01.sh
chmod u+x cha01.sh
------------------
#!/bin/bash
...
------------------
#执行脚本并根据需要传参
	./PATH/cha01.sh PARAM[PARAM2 ... PARAMN]
#脚本中如何解析参数
	$# #表示参数的数量
	$n #表示第n个参数的值

变量

#变量
	VAR_NAME=VALUE #声明并负值,等号右边的值决定了左边变量的数据类型
	unset VAR_NAME #取消变量
	echo $VAR_NAME #使用变量需要加 $
#将命令结果存入变量
	RST=`ls /etc/profiled.` #[反引号执行命令有阻塞功能]
	RST=$(ls /etc/profile.d)
	#当命令中出现变量导致不能正常执行
	#解决方案一:先将命令字符串拼接完成,再以命令的方式执行
	RST="mv $SOFTWARE_DIR$RST $SOFTWARE_DIR'jdk'"
	RST=$RST
	#解决方案二:用eval表达式完成拼接和命令转换执行的过程
	eval mv $SOFTWARE_DIR$RST $SOFTWARE_DIR'jdk'
#双引号中可以传入参数$RST#单引号只当字符串处理
	'$RST'

算数表达式

#算数表达式
((ARITHMETIC_EXPRESSION))
((VAR++))	#自增
#数学计算
#1.let
#2.(())
#3.使用$[[]]
#4.使用expr
#5.bc
#6.使用awk
	

分支结构

#单分支
	if []
	then
		...
	fi
#双分支
	if []
	then
		...
	else
		...
	fi

#多分支
	if []
	then
		...
	else if []
	then
		...
	else
		...
	fi
#条件表达式的书写规范
	if [ $VAR -gt/ge/lt//le/eq/ne $VAR2/CONST -a/-o CONDITION2 ]
	if (($VAR>=CONST && $VAR<top))
	if [[ $VAR=~REGEX ]]
	if [[ $VAR ]]	#是否存在变量 VAR ture=>表示存在,false=>不存在
	if [ -n $VAR ] #$true if not empty
	if [ -z $VAR]  #true if empty
		-e 判断对象是否存在
		-d 判断对象是否存在,并且为目录
		-f 判断对象是否存在,并且为常规文件
		-L 判断对象是否存在,并且为符号链接
		-h 判断对象是否存在,并且为软链接
		-s 判断对象是否存在,并且长度不为0
		-r 判断对象是否存在,并且可读
		-w 判断对象是否存在,并且可写
		-x 判断对象是否存在,并且可执行
		-O 判断对象是否存在,并且属于当前用户
		-G 判断对象是否存在,并且属于当前用户组
		-nt 判断file1是否比file2新  [ "/data/file1" -nt "/data/file2" ]
		-ot 判断file1是否比file2旧  [ "/data/file1" -ot "/data/file2" ]

循环结构

#数组
	arr=(henry pola ariel)	#创建数组
	${arr[@]}/${arr[*]}		#将数组转化为列表后返回
	${arr[INDEX]}			#获取数组指定下标的元素
	${#arr[@]}				#获取数组长度
		
#循环
for i in $arr
do
	...
done

函数结构

#函数基本结构
[ function ] funname [()]

{

    action;

    [return int;] #只返回整数,基本不用

}
#获取函数返回值
function funname(){
	RST=
}

#函数传入参数并获取返回值
function show(){
	echo $1','$2','$#
}
RST=`show henry pola`
echo $RST

常用函数整理

字符串函数

#grep [文本查找]
#获取文件路径
	dirname FILE_PATH
#获取文件名
	basename FILE_PATH
#资源检索
	find PATH [option] SOURCE_NAME
	#例如
	find / -name mysql
#echo控制台输出
	#不换行输出
	echo -n 
	#向文件中插入空行
	echo -e>>file.txt
#cat
	#把文件做成空文件
	cat /dev/null > file.txt
	
#sed函数
#非交互流式文本【编辑】器
#对文本文件进行增、删、改、查等操作
#支持瀚航、字段、正则匹配文本内容
#基本语法
	sed [-opts] 'COMMAND' FILE_PATH
#选项参数
		-n #编辑结果不输出
		-r #支持正则匹配
	sed -rin '/^#jdk/,/^CLASSPATH/d' myenv.d
		-e #支持油条有分号隔开的sed命令
	sed -n -e 's/usr/USER/g;s/profile/PROFILE/g' profile
		-f #将命令封装在文件中使用
		vim opr.sed
		----------------
		s/usr/USER/g;
		s/profile/PROFILE/g;
		----------------
	sed -f opr.sed profile
		-i #无-i只输出预览,可以重定向到文件或覆盖源文件
#动作说明
	i	#插入:向匹配行之前插入内容
	#在第三行之前插入hello
		sed '3ihello' 1.txt
	#"unset i"上插入AABBCC
		sed -i '/unset i/iAABBCC' profile
	#"unset i"下插入AABBCC
		sed -i '/unset i/aAABBCC' profile
	#在最后一行之前插入hello
		sed '$ihello' 1.txt
	#在第一行之前插入空行
		sed -in '1{x;p;x}' $ENV_DIR
	#在匹配行之前插入
		sed -in '/games/{x;p;x}' 1.txt
	#在匹配之后插入
		sed -in '/games/G' 1.txt
	#在匹配之前和之后插入
		sed -in '/games/{x;p;x;G}' 1.txt
	#在每一行之后添加空行
		sed -in G 1.txt
	#在每一行之后添加两行空行
		sed -in 'G;G' 1.txt
	#不管有没有空行,保证只有一个空行
		sed -in '/^$/d;G' 1.txt
		
	a	#追加:向匹配行后插入内容
	#向第三行后面添加hello,3表示行号
		sed '3ahello' 1.txt 
	#向内容123后面添加hello,如果文中包含多行123,则每行后面都会添加
		sed '/123/ahello' 1.txt 
	#在最后一行添加hello
		sed '$ahello' 1.txt
	c	#更改:更改匹配行的内容
	
	#将文件1.txt的第一行替换为hello
		sed '1chello' 1.txt
	#将包含123的行替换为hello
		sed '/123/hello' 1.txt
	#将最后一行替换为hello
		sed '$chello' 1.txt
		
	d	#删除
	#删除第四行
		sed '4d' 1.txt
	#从第一行开始删除,每个2行就删掉一行,级删除奇数行
		sed '1~2d' 1.txt
	#删除1~2行
		sed '1,2d' 1.txt
	#删除1~2之外的所有行
		sed '1,2!d' 1.txt
	#删除最后一行
		sed '$d' 1.txt
	#删除匹配123的行
		sed '/123/d' 1.txt
	#删除匹配123的行到最后一行
		sed '/123/,$d' 1.txt
	#删除匹配123的行及其后面一行
		sed '/123/,+1d' 1.txt
	#删除空行
		sed '/^$/d' 1.txt
	#删除不匹配123或abc的行,/123\\|abc/表示匹配123或abc,!取反
		sed '/123\\|abc/!d' 1.txt
	#删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行
		sed '1,3{/123/d}' 1.txt

	s	#替换
	#将文件中的123替换为hello,默认只替换为hello,默认只替换每行第一个123
		sed 's/123/hello/' 1.txt
	#将文本中所有的123都替换为hello
		sed 's/123/hello/g' 1.txt
	#将每行中第二个匹配的123替换为hello
		sed 's/123/hello/2' 1.txt
	#将每行中所有匹配的123替换为hello,并将替换后内容写入2.txt
		sed -n 's/123/hellp/gpw 2.txt' 1.txt
	#匹配有#号的行,替换匹配行中逗号后的所有内容为空(,.*)表示逗号后的所有内容
		sed '/#/s/,.*//g' 1.txt
	#替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾(..$)表示匹配最后两个字符
		sed 's/..$//g' 1.txt
	#将1.txt文件中以#开头的行替换为空行,即注释的行(^#)表示匹配以#开头,(.*)代表所有内容
		sed 's/^#.*//g' 1.txt
	#先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
		sed 's/^#.*//;/^$/d' 1.txt
	#将每一行中行首的数字加上一个小括号(^[0-9])表示行首是数字,&符号代表匹配的内容
		sed 's/^[0-9]/(&)/' 1.txt
	#替换左侧特殊字符需要转义,右侧不需要转义,\\1代表匹配的内容
		sed 's/[0-9]/(\\1)/' 1.txt
	#在文件的每一行后面加上“haha”字段
		sed 's/$/&'haha'/' 1.txt

数学函数

#生成序列
seq -s 'SEPETATOR' -w | -f 'b%05ge' $1 step $2

以上是关于Shell编程-基础的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程基础

Shell编程基础:函数

shell编程基础

linux学习19 shell脚本基础-bash脚本编程基础及配置文件

第九章shell脚本编程基础

Shell编程(基础)