shell编程基础实践

shell基础理论

图形界面或命令(dos/shell/hdfs-dfs)/程序->系统api->系统->硬件
#shell
	#what
		#是一个环境,提供了对linux(unix)系统的接口
		#向你接收输入,并根据输入执行程序,并显示程序的输出
		#可以运行我们的命令,程序和shell脚本
classification
	#就行有不同类型得系统一样,shell也有不同版本,每个版本都有自己得一套命令1和功能
	unix shell写于20世纪70年代中由斯蒂芬伯恩,在新泽西AT&T贝尔实验室
	Bourne shell. 提示符$后面跟命令行参数
	C shell.		提示符%

shell脚本

#命令列表中列出的顺序执行
	#创建->编辑->保存
	[root@single shell]# vi three.sh
	[root@single shell]# ls
	three.sh
	
	#!/bin/bash		命令开头必须要使用
	:<<!
	echo -n "hello kb10"
	echo "hello kb11"
	!
	esc :x/w 
	
	#修改权限
	ls -la
	-rw-r--r--. 1 root root   31 Nov 23 09:06 three.sh
	chmod u+x test.sh
	-rwxr--r--. 1 root root   31 Nov 23 09:06 three.sh
	#执行
	./three.sh

shell命令

#echo [-n] "..."	控制台输出
	#read VAR			控制台输入
	#命令行输入
		echo -n "please enter your name => "
		read NAME
		echo "my name is $NAME"
	#控制台输出
		[root@single shell]# ./three.sh
		please enter your name => (王者)手动输入      
		my name is 王者

shell注释

#单行:#...
#多行::<<!  ... !

shell变量

#变量:数字、字母、下划线、一般字母大写
	#值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
	#shell可以创建,分配和删除变量
	#创建
		 NAME="henry"
		 AGE=18
	#使用
		 echo "$NAME,$AGE"
	#命令
	 	NAME="henry"
		AGE=18
		echo "$NAME,$AGE"
	#控制台
		[root@single shell]# ./three.sh
		henry,18

	#取消/删除
	 	unset NAME
	#命令
		NAME[0]="zs"
		NAME[1]="ls"
		unset NAME
	#控制台
		[root@single shell]# ./three.sh
		[root@single shell]# 

常量

readonly FINAL="1001"

#变量分类

局部变量:当前实例有效
	环境变量:跨实厉访问
	当前登录有效的临时环境变量
	export VAR
	export -f  代表[变量名称]中为函数名称
	export -p		#列出所有的shell赋予程序的环境变量
	export -n 		#删除环境变量VAR变量实际上并未删除,只是不会输出到后续指令的执行环境中。
	export VAR		#添加环境变量VAR

shell变量命令符:

		$$		当前shell进程编号
		$0		当前脚本的文件名
		$n		脚本参数		如:./one.sh henry 18,则脚本中的$1为henry
		$#		脚本参数得到数量	如上:2
		$*		脚本参数的完整集合	如上:henry,18
		$@		脚本参数的独立集合	如上:henry,18
		# $* vs $@
		# 不加""两者相同
		#加上""则$*代表整体,而$@代表个体
		
		$?		上一条命令的执行结果状态值或函数的返回值;0表示正常,1表示失败1
		$!		The process number of the last background command.

shell数组

#标准变量:保持一个类型一值的变量
	#数组:支持不同类型的变量,可以在同一时间容纳多个值
	#创建赋值
		NAME=(aa 18 true)
		NAME[0]="henry"
		NAME[1]="pola"
		NAME[2]="ariel"
	#使用
		echo $NAME		#首元素
		echo ${NAME[0]}	#第一个元素
		echo ${NAME[1]}	
		echo ${NAME[2]}
		echo ${NAME[*]}	#所有元素
		echo ${NAME[@]}	
		echo ${NAME[0]}	#数组长度
	#命令行
		NAME=(aa 18 true)
		NAME[0]="henry"
		NAME[1]="pola"
		NAME[2]="ariel"
		echo $NAME              
		echo ${NAME[0]}
		echo ${NAME[1]} 
		echo ${NAME[2]}
		echo ${NAME[*]}
		echo ${NAME[@]} 
		echo ${NAME[0]}
	#控制台
		[root@single shell]# ./three.sh
		henry
		henry
		pola
		ariel
		henry pola ariel
		henry pola ariel
		henry

shell运算符

#算术运算符

	#shell早期未设计算术,但可以在外部程序awk或expr
	#expr expr与运算符和其他值之间【必须有空格】,所有的算术计算,使用整数
		#*需要转译 、*
		#不支持小数计算
			VAL=`expr 2 + 2`
			let "VAL=2**3"
			VAL=$((2+3))
			echo $VAL
			#+ - * / % = ++ --
			[ 2 == 2 ]	#=>true
			[ 2 != 2 ]	#=>false
			var=`expr 2 + 3`
		#命令行输入
			echo $var
			var=`expr 2 - 3`
			echo $var
			var=`expr 2 \* 3`
			echo $var
			var=`expr 2 / 3`
			echo $var
			var=`expr 2 % 3`
			echo $var
		#控制台输出
			[root@single shell]# ./three.sh
			5
			-1
			6
			0
			2

#关系运算符

# -eq -ne -lt -le -gt -ge

#布尔运算符

# ! -o -a
		[ 2 -lt 3 -o 5 -gt 3]
# || &&
	[[ 2 < 3 || 5 > 3 ]]

#字符串运算符

#二元:== != =~
#命令行输入
	if [ $1 == "henry" ]
	then
	        echo "is henry"
	else
	        echo "is not henry"
	fi
	
	
	if [[ $1 =~ ^[0-9]+$ ]]
	then
	        echo "is henry"
	else
	        echo "is not henry"
	fi

	[[ $var =~ PATTERN ]]
	不加\"

#正则匹配

^		开始
$		结束
.		一个任意字符
[]		指定范围	[abc][0-9][^a-b1-9]
\<		单词开始
\>		单词结束
\b		单词开始或结束
\B		非单词开始或结束
?		{0,1}
+		{1,}
*		{0,}
{n,m}	最少n次,最多m次
{n,}	最少n次
{,m}	最多m次
{f}		固定f次
\		转义符
()		组合
|		或
#一元:-z(是否为空) $str(是否不为空)
#文件测试操作(一元左置)
	#-e -d -f -r -w -x -s (not empty)
#命令行输入
if [ -r $1 ]
then
        echo "radeable"
else
        echo "unreadable"
fi

#特殊表达式

``<=>$()			#命令替换符,兼容性``更好

OUTPUT=`start-all.sh`
先执行start命令,执行完把结果赋值给OUTPUT,默认有线程等待,延时加载
...

(())				#算术运算加强版
# && ||
# ++ -- **

$(()) <=> $[]		#算术运算,$(())中变量可以加$也可以不加

[]					#test命令
[[]]				#字符串计算加强版

${}
	${STR#*WORD}			
	#若STR符合WORD,将最短(WORD和左侧)的删除<=>${STR%WORD}(WORD和右侧)
#命令行输入
	VAR="/opt/software/hadoop/a.txt"
	VAR=${VAR%/*}
	echo $VAR
#控制台输出
	[root@single shell]# ./three.sh
	/opt/software/hadoop

	${STR##*WORD}			
	#若STR符合WORD,将最长(WORD和左侧)的删除<=> ${STR%WORD}(WORD和右侧)
#命令行输入
	VAR="/opt/software/hadoop/a.txt"
	VAR=${VAR##*/}
	echo $VAR
#控制台输出
	a.txt
	
	${STR/WORD/REPLACE}		
	#若STR符合WORD,将第一个匹配项替换为REPLACE
	#命令行输入
	VAR="/opt/software/opt/a.txt"
	VAR=${VAR/opt/123}
	echo $VARopt
	#控制台输出
	[root@single shell]# ./three.sh
	/123/software/opt/a.txt

	${STR//WORD/REPLACE}
	#若STR符合WORD,将所有匹配项替换为REPLACE
	#命令行输入
	VAR="/opt/software/opt/a.txt"
	VAR=${VAR//opt/123}
	echo $VAR
	#控制台输出
	[root@single shell]# ./three.sh
	/123/software/123/a.txt

	${STR:-DE_VALUE}		#若STR未赋值或为空置,则设定STR值为DF_VALUE
	#命令行输入
	STR=(12)
	echo ${STR:-DE_VALUE}
	#控制台输出
	[root@single shell]# ./three.sh
	12

	${ARRAY[IX]}			#获取数组ARRAY下标IX的元素
	#命令行输入
	ARR=(henry 12 wsdf 严旭) 
	echo ${ARR[2]}
	#控制台输出
	[root@single shell]# ./three.sh
	wsdf

	${#ARRAY[@]}			#获取数组ARRAY的长度(ITEM1 ITEM2...)
	#命令行输入
	ARR=(henry 12 wsdf 严旭) 
	echo ${#ARR[@]}
	#控制台输出
	[root@single shell]# ./three.sh
	4

	${ARRAY[*]}				#整个数组
	#命令行输入
	ARR=(henry 12 wsdf 严旭) 
	echo ${ARR[*]}
	#控制台输出
	[root@single shell]# ./three.sh
	henry 12 wsdf 严旭
上一篇:Web技术基础——新手小白的CSS学习之路


下一篇:如何向非技术人员解释Kubernetes