学过其他编程语言的,比如说JAVA都这知道定义变量的时候,需要在变量名之前设置变量类型,比如说需要定义一个字符串:String xxx="......"
在Shell中定义变量
在shell定义变量要简单得许多,它更像是javaScript,不需要去指定变量类型,也就是说你的变量值是字符串,变量就是String类型,是数字就是int类型,不过Shell定义变量比javaScript还要简单连var都省略了
1.显式定义

2.使用语句定义

3.只读变量:readonly+变量名 只读变量不可修改,unset也不能删除

小结:
输出时尽量使用双引号,单引号不能随便使用,单引号字符串中的变量无效且单引号中无法转义,因为单引号中无法出现单引号
Shell中的字符串
1.获取字符串长度
获取字符串长度有多种,这里只介绍最简单的一种:${#变量名}

2.提取字符串:${变量名:开始下标:结束下标}

3.查找字符串中的字符处于字符串的第几个位置:`expr index "${变量名}" 需要查找的字符`

Shell数组
1.定义数组:数组名=(value1 value2),每个元素用空格分开

2.1获取数组中的元素

2.2获取数组中的所有元素

3.1.获取数组的长度:${#数组名[@]}

3.2获取数组中指定元素的长度:${数组名[下标]}

Shell注释
1.单行注释:#.........
2.多行注释:
:<<EOF
注释内容
。。。。。
。。。。。
EOF
或者
:<<'
注释内容
。。。。。
。。。。。
'
或者
:<<!
注释内容
。。。。。
。。。。。
!
Shell echo命令
echo用于在终端输出:echo "......."就会输出对应的字符串
1.显示转义字符

2.开启转义:echo -e "........."

3.输出内容定向至文件:echo "........" > 文件名

4.获取当前时间:echo `date`


Shell test命令
此命令用于检查某个条件是否成立,可以是数值、字符和文件三种形式
1.数值测试


int类型变量的数学运算

2.字符串测试

2.1判断两个字符串值是否相等

注意:这里的变量的不是数字类型不用加[ ],直接引用变量就行了
2.2判断字符串长度是否为空

if后面不需要加test,跟上二元表达式就行了
3.文件测试


4.Shell中的与(-a)、或(-o)、非(!)
这三个逻辑操作符它们的优先级为!>-a>-o

Shell流程控制
其表达式为:
if [判断条件]
then
...........(执行语句)
else或elif
...........(执行语句)
fi(记得if语句需要闭合)
注意:如果没有第二判断条件不需要加上else否则会报错


Shell for循环
表达式为:
for 变量名 in value1 value2 value3.......... (每个变量值使用空格分开)
do
(执行语句)..................
done(最后记得闭合)


如果你习惯了其他语言的写法,可以像这样写
for ((i=1;i<10;i++)); do
(执行语句).........
done
第一种写法更像是foreach,其实这两种写法还是有一些区别的,具体怎么用根据实际情况决定
Shell while语句
while语句用于不断循环语句,也可以不断从输出语句中输出语句,其语法为:
while ((条件表达式))或while [条件表达式] 。(区别在于(())内放置的是<、>、=这些符号,而[ ]内放置表达式,如-eq、-gt 、-lt)
do
(执行语句)..............
done

注意:如果使用while(())这种方式,在使用判断符号</>/=时最好不要空格,[ ]这种方式使用判断符号时需要空格
读取键盘信息

read + 变量名,它的作用跟Scanner(JAVA)、scanf(C语言)一样
无限循环
表达式:
while :
do
(执行语句)............
done


until循环
与while相反,当条件表达式为true时跳出循环
语法:
until [条件表达式]
do
(执行语句).............
done

case选择语句
语法:
case value(你设置的变量) in
1) 执行语句..............
;;
2) 执行语句...................
;;
...................................
;;
n) 执行语句.................
;;
esac(语句闭合,就是case反过来写)

还有一种简单的写法

break和continue
跟其他语言一样,Shell中也是有跳转语句的,在Shell中跳转语句只能用在for、while和until中

在这里使用continue最后一句输出语句永远不会被执行,但是用break则会执行
break跳出所有循环
continue跳出当前循环
函数
其语法与JavaScript有异曲同工值处
[ function ] 方法名[()]
{
(操作执行).......
[ return int ]
}
⭐:中括号内是可以不写的部分
1.无参数、不带return

2.无参数、带有return


3.带参数传递

⭐:函数中的$n就是调用第n个参数,比如说调用第一个参数就是$1,调用第十个参数是${10},在Shell中当n>=10时在调用时需要加上{ }

$#是获取参数个数,还有一些特殊参数见下图

输入/输出重定向
在渗透实战中重定向操作是我们常用的

这个操作其实并不难,通常我们只用得到前面三个
1.将输出定向到指定文件,>指定文件名,当我我们需要查看某信息时就可以打开这个文件查看
2.将文件内的内容定向到终端,就是将文件内预制的指令读取出来
3.追加输出,文件内原有的内容不会被替换
文件包含
和其他语言类似,Shell也可以包含外部文件,简单的来说就是把一些公用的方法、代码放置在一个文件中,在需要使用的时候方便另一个文件调用
1.新创建一个脚本文件:touch 文件名
2.在新脚本写入代码

3.在另一个脚本中调用

⭐:调用文件格式为. 文件名(.和文件名之间有一个空格)
4.运行

⭐:被调用文件不需要添加可执行权限,只要调用的文件有执行权限就行了
网友评论