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 查看文本