我也码

快速入门Shell(bash)编程

2019-10-12  本文已影响0人  银枪镴枪头

学过其他编程语言的,比如说JAVA都这知道定义变量的时候,需要在变量名之前设置变量类型,比如说需要定义一个字符串:String xxx="......"

在Shell中定义变量

在shell定义变量要简单得许多,它更像是javaScript,不需要去指定变量类型,也就是说你的变量值是字符串,变量就是String类型,是数字就是int类型,不过Shell定义变量比javaScript还要简单连var都省略了

1.显式定义

echo就是输出语句,注意在使用变量时一定要加$符号,{}可以不加,但建议还是加上,不要偷这一点懒

2.使用语句定义

in前面的是变量,后面是变量值,意思是将LiDaiTou这个字符串赋值给变量name,结束时千万别忘记加上'done'

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

小结:

    输出时尽量使用双引号,单引号不能随便使用,单引号字符串中的变量无效且单引号中无法转义,因为单引号中无法出现单引号


Shell中的字符串

1.获取字符串长度

    获取字符串长度有多种,这里只介绍最简单的一种:${#变量名}

空格也会算作一个字符串,这里输出的结果是11

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

下标6是一个空格,最后一个下标不算,这里输出I Love,也就是说最终的输出结果是:开始下标~~结束下标-1位置的字符串

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

查找L或e字符,哪个字符先出现就计算哪个

Shell数组

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

2.1获取数组中的元素

获取数组中下标为0的元素

2.2获取数组中的所有元素

${file[@]}===${file[*]}

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

输出:2,这个数组中有2个元素

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

输出:5,这个元素有5个字符

Shell注释

1.单行注释:#.........

2.多行注释:

    :<<EOF

        注释内容

        。。。。。

        。。。。。

    EOF

或者

    :<<'

注释内容

。。。。。

。。。。。

'

或者

:<<!

注释内容

。。。。。

。。。。。

!


Shell echo命令

echo用于在终端输出:echo "......."就会输出对应的字符串

1.显示转义字符

\是转义符号,输出:"shell is a part of kali "

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

\n是换行

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

如果text在当前目录下,则不用指定父级目录,否则指定完整路径

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

Shell test命令

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

1.数值测试

图片转载自菜鸟教程 1.先创建两个变量。2.判断两个值得逻辑关系,输出num1<num2

int类型变量的数学运算

[ ]执行基本的数学运算,输出:300

2.字符串测试

图片转载自菜鸟教程

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

1.创建两个变量接收字符串。2.判断两个字符串是否相同。输出:these two values are not equal

注意:这里的变量的不是数字类型不用加[ ],直接引用变量就行了

2.2判断字符串长度是否为空

输出:str1!=0

if后面不需要加test,跟上二元表达式就行了

3.文件测试

图片转载自菜鸟教程 判断这个文件是否存在如果存在输出第一条语句,否则执行change变量中的命令。输出:/etc目录下的所有文件

4.Shell中的与(-a)、或(-o)、非(!)

    这三个逻辑操作符它们的优先级为!>-a>-o

输出第一句话

Shell流程控制

其表达式为:

    if [判断条件]

    then

        ...........(执行语句)

    else或elif

        ...........(执行语句)

    fi(记得if语句需要闭合)

注意:如果没有第二判断条件不需要加上else否则会报错

值得注意的是在[ ]的首尾都必须加上空格,否则会报以下错误 虽然在Shell中报错仍会执行下面的语句,但若是在以后的渗透实战中可能会造成不可预估的结果

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

let命令用于计算一个或多个表达式,计算变量时不需要加$。详情查阅Bsah let命令

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


读取键盘信息

执行语句的最后加上break不然会陷入死循环

read + 变量名,它的作用跟Scanner(JAVA)、scanf(C语言)一样


无限循环

表达式:

    while :

        do

            (执行语句)............

        done

也可以写成for (( ; ; ))

until循环

    与while相反,当条件表达式为true时跳出循环

语法:

    until [条件表达式]

    do

        (执行语句).............

    done

输出:9。增长到10的时候跳出循环没有输出

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.运行

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

上一篇下一篇

猜你喜欢

热点阅读