shell脚本基础

shell 中的注释

		① 行注释  #
		② 段落注释 
		```
		:<<EOF
		注释内容...
		注释内容...
		注释内容...
		EOF
		```
		其中的EOF 可以替换成其他字符

定义变量

		Variable="hello"

使用变量

使用 $ 符号进行调用,这里需要注意的是在字符串中调用变量的情况, 只有在双引号内才可以引用变量值
单引号会失效
比如 :
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

获取字符串长度

	${#variable}

获取子串

	${#variable:0:2}    # 截取 0位置 到 2位置的子串

shell 数组

	bash 支持一维数组,没有限定数组大小,不支持多维数组。
	数组定义:
	数组名=(value1 value2...)
	调用和字符串类似,获取所有的元素使用 @

shell 传参

	这里需要注意的是,参数0 ($0)为 执行的文件名
	特殊参数
	
	```
	$#	传递到脚本的参数个数
	$*	以一个单字符串显示所有向脚本传递的参数。
	如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
	$$	脚本运行的当前进程ID号
	$!	  后台运行的最后一个进程的ID号
	$@	与$*相同,但是使用时加引号,并在引号中返回每个参数。
	如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
	$-	    显示Shell使用的当前选项,与set命令功能相同。
	$?	显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
	```

$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”
(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

文件测试运算符

	-b file  是否是块设备文件。
	-c file  是否是字符设备文件。
	-d file 是否是目录
	-f  file是否是普通文件
	-k file 是否设置了黏着位 ①
	-p file 是否是有名管道②
	-u file 是否设置了SUID位③
	-r file 是否可读
	-w file 是否可写
	-x file 是否可执行
	-s file 是否为空
	-e file 是否存在
	-L 是否是一个符号链接

粘着位。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。
如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。在我们系统中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
一个目录具有粘滞位,则在other的X位会表现为 t,或者T.大小写的区别在于,原来x位上有x权限,有了粘滞位则表现为t.否则,表现为T。
有名管道是可以让同一台计算机上的任意两个无关系的进程通信。而无名管道则是必须需要通信的进程间存在关系,比如父子进程。
有名管道是在进程使用管道时在系统内存上开辟的一段空间,如果A需要给B传递某些信息,A进程就给那段开辟的空间里写入数据,而B也从那段开辟的空间里读取数据,并且重要的一点是管道保存的数据是未被进程读的,或者说B读数据就好比循环队列,读过的数据就出队消毁了,不会停留在管道中被重复读取。
③ SUID 是 Set User ID
SGID 是 Set Group ID
suid意味着如果A用户对属于他自己的shell脚本文件设置了这种权限,那么其他用户在执行这个脚本的时候就拥有了A用户的权限。所以,如果root用户对某一脚本设置了这一权限的话则其他用户执行该脚本的时候则拥有了root用户权限。同理,guid意味着执行相应脚本的用户则拥有了该文件所属用户组中用户的权限。

将数据写到指定文件中

	echo "data " > target   # 盖掉就数据
	echo "data" >> target  # 不清除原数据,在后面追加

printf 命令

需要注意,printf 不会自动添加换行符。,可以手动添加 \n

.

test命令

	-eq	等于 
	-ne	不等于 
	-gt	大于 
	-ge	大于等于 
	-lt	    小于 
	-le	小于等于 

需要注意的是等号两边不能有空格
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

if……then……elif……then……else …… fi

需要注意的是判断条件的中括号与变量,变量与关系运算符之间都要加空格
例:if [ $a == $b ]

for循环

	for value in param1 param2 param3... paramN
	do 
		line1
		line2
		...
	done

上面类似于Java 里面的foreach
int[] arr = {1,2,3};
for(int i :arr) {

}

while 循环

	while condition
	do
	    command
	done 

until 循环

until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
until condition
do
command
done

case 多选择语句

	case value in
	branch1)
	    command1
	    command2
	    ...
	    commandN
	    ;;
	branch2)
	    command1
	    command2
	    ...
	    commandN
	    ;;
	esac

case取值后面必须为单词in,每一分支必须以右括号结束。value可以为变量或常数。匹配发现value符合某一分支后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个分支。一旦分支匹配,则执行完匹配分支相应命令后不再继续其他分支。如果无一匹配分支,使用星号 * 捕获该值,再执行后面的命令。
类似于 JAVA中的switch……case

跳出循环 break 以及continue

函数

参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
$? 不止可以判断上一步是否正常退出,还可以获取函数返回值,不过需要紧随着函数执行步骤之后,因为它只对上一条命令负责。

其他

	wc   统计行数
	cat  查看文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值