shell编程

一,概述

什么是shell;

Shell(壳)是一个命令行界面,用于与操作系统进行交互。它是用户与系统之间的桥梁,允许用户执行命令、运行程序和管理文件系统。Shell 可以通过输入文本命令来控制操作系统,通常用于自动化任务和脚本编程。

总的来说,Shell 是计算机用户与操作系统交互的重要工具,尤其在开发和系统管理领域发挥着重要作用。

二,shell的解释器

在Linux中提供的解释器;

bash 复制代码
/bin/sh
/bin/bash   #最常用的
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

bash和sh有什么关系?

sh->bash
bash实际上是sh的一个超链接

三,shell脚本入门

1,脚本的格式;

脚本以 #!/bin/bash 开头

目的是为了指定脚本的解释器;

2,第一个shell脚本HelloWorld!;

bash 复制代码
#!/bin/bash
echo "helloworld"

脚本的执行方式;

(1),sh+相对/绝对路径,bash+相对路径

(2),直接采用相对或者绝对路径执行;(必须要有x的权限)

3,shell脚本实现多命令处理;

bash 复制代码
#!/bin/bash

cd /home/love
touch cls.txt
echo "I love cls" >>cls.txt

四,shell中的变量

1,系统变量

也称为环境变量;

作用域:整个用户或者整个操作系统;

位置:/etc/profile 文件

显示当前用户的环境变量:set

2,自定义变量

普通变量: 作用域是当前shell(当前的解释器)
每一次的窗口启动,都会创建一个新的bash;
1 .基本语法

  • 定义变量:变量=值
  • 撤销变量:unset 变量
  • 声明静态变量:readonly变量,注意:不能unset

2 .变量定义规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
  • 等号两侧不能有空格
  • 变量的值如果有空格,需要使用双引号或单引号括起来。

变量的作用范围;

在test001中定义的变量,内部可以正常访问,但是外部不可以访问;

在外部定义的环境变量,外部可以正常访问,但是内部不可以访问;

使用export修饰之后,内部和外部即可实现正常的访问;

3,特殊变量$n

基本语法:n表示一个数字;10以上的参数要加${10};

4,特殊变量$#

功能描述:获取所有输入参数个数,常用于循环

5,特殊变量\*和@

\* (功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)

@ (功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)

6,特殊变量$?

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执 行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

执行成功------>0

执行失败------>非0即可

五,运算符

(1)"((运算式))"或"[运算式]"

(2)expr + , - , *, /, % 加,减,乘,除,取余

注意:expr运算符间要有空格

cpp 复制代码
┌──(root?kali)-[~/shell]
└─# expr 9 \* 4
36
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# expr 9 + 4 
13
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# expr 9 - 4 
5
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# expr 9 \* 4
36
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# expr 9 / 4 
2
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# expr 9 % 4 
1

使用 [ ] 进行混合运算;

六,条件判断

1,基本语法;

[ condition ](注意condition前后要有空格

注意:条件非空即为true,[ laoxiao ]返回true,[] 返回false。

2,常用的判断条件;

(1)两个整数之间比较

  • = 字符串比较
  • -lt 小于(less than)
  • -le 小于等于(less equal)
  • -eq 等于(equal)
  • -gt 大于(greater than)
  • -ge 大于等于(greater equal)
  • -ne 不等于(Not equal)

(2)按照文件权限进行判断

  • -r 有读的权限(read)
  • -w 有写的权限(write)
  • -x 有执行的权限(execute)

(3)按照文件类型进行判断

  • -f 文件存在并且是一个常规的文件(file)
  • -e 文件存在(existence)
  • -d 文件存在并是一个目录(directory)

注意:任何命令的执行状态为0则为True,否则为False

3,示例;

bash 复制代码
#!/bin/bash

id zhangsan &> /dev/null && echo "zhangsan用户已经存在,不需要添加"

id zhangsan &> /dev/null || useradd zhangsan


执行结果:
┌──(root?kali)-[~/shell]
└─# bash text005.sh    
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# echo $?
0
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# id zhangsan
uid=1001(zhangsan) gid=1002(zhangsan) groups=1002(zhangsan)
                                                                                                                                              
┌──(root?kali)-[~/shell]
└─# bash text005.sh
zhangsan用户已经存在,不需要添加
bash 复制代码
#!/bin/bash

[ $# -gt 2 ] && echo "输入的参数大于2"


输出:
┌──(root㉿kali)-[~/shell]
└─# bash text004.sh a b

┌──(root㉿kali)-[~/shell]
└─# bash text004.sh a b c
输入的参数大于2
                                                                                                                                              

七,流程控制

1,if判断;

基本语法:

if [ 条件判断式 ];then
    程序
fi
或者
if [ 条件判断式 ]
then
    程序
fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

示例:

bash 复制代码
#!/bin/bash

if [ $1 -lt 18 ];then
    echo "未成年"

elif [ $1 -ge 18 -a $1 -lt 30 ];then
    echo "青年"

else
    echo "中老年"

fi

2,case语句;

基本语法:

case $变量名 in
    "值1")
        如果变量的值等于值1,则执行程序1
        ;;
    "值2")
        如果变量的值等于值2,则执行程序2
        ;;
    ...省略其他分支...
    *)
        如果变量的值都不是以上的值,则执行此程序
        ;;
esac

注意事项:

(1) case行尾必须为单词"in",每一个模式匹配必须以右括号")"结束。

(2) 双分号";;"表示命令序列结束,相当于java中的break。

(3) 最后的"*)"表示默认模式,相当于java中的default。

示例:

bash 复制代码
#!/bin/bash

case $1 in

"a")
    echo "你输入的是a"
    ;;

"b")
    echo "你输入的是b"
    ;;

*)
    echo "你输入的是其他字符"
    ;;

esac

3,for循环;

基本语法(一):

for (( 初始值;循环控制条件;变量变化 ))
do
    程序
done

基本语法(二):

for 变量 in 值1 值2 值3...
    do
        程序
    done

示例1:

bash 复制代码
#!/bin/bash

s=0
for ((i=0;i<=100;i++));do

    s=$[$s+$i]
done

echo "求和结果为$s"

示例2:

bash 复制代码
#!/bin/bash

#for i in {1..100};do
#可以使用下面的语句来代替
for i in `seq 1 100`;do
    s=$[$s+$i]
done

echo "求和的结果是$s"

示例3:

bash 复制代码
#!/bin/bash

for i in `ls /`;do 
    echo $i;
done

比较\*和@区别

(a)\*和@都表示传递给函数或脚本的所有参数,不被双引号""包含时,都以$1 2 ...n的形式输出所有参数。

(b)当它们被双引号""包含时,"$*"会将所有的参数作为一个整体,以"$1 2 ...n"的形式输出所有参数;"$@"会将各个参数分开,以"$1" "2"..."n"的形式输出所有参数。

4,while循环;

基本语法:

while [ 条件判断式 ]
do
    程序
done

示例:

bash 复制代码
#!/bin/bash

i=1
sum=0

while [ $i -le 100 ];do
    let sum=sum+i
    #sum=$[$sum+$i]
    let i++
done

echo "求和的结果是:$sum"


运行结果:
┌──(root㉿kali)-[~/shell]
└─# bash while.sh
求和的结果是:5050

八,read读取控制台数据

基本语法;

read(选项)(参数)
选项:
    -p:指定读取值时的提示符;
    -t:指定读取值时等待的时间(秒)。
参数
    变量:指定读取值的变量名

示例;

bash 复制代码
#!/bin/bash

read -t 10 -p "请输入一个数字:" n

i=1;
sum=0;
while [ $i -le $n ];do
    let sum=sum+i
    let i++
done

echo "求和结果是:$sum"

运行结果;

九,函数

封装了某一个功能,对其进行调用即可;

1,系统函数;

(1)basename;

基本语法:

basename [string / pathname][suffix]

功能描述:basename命令会删掉所有的前缀包括最后一个 ('/')字符,然后将字符串显示出来。

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

示例:

(2)dirname;

基本语法:

dirname 文件绝对路径

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

2,自定义函数;

基本语法:

[ function ] funname[()]
{
    Action;
    [return int;]
}
funname

注意:

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译;

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255);

(3)可以采用标准输出:echo来作为函数的返回值;

示例:

bash 复制代码
#!/bin/bash

function sum(){
    let s=$1+$2
    echo $s
    return $?
}

sum 10 20


运行结果:
┌──(root?kali)-[~]
└─# bash sum.sh
30
bash 复制代码
#!/bin/bash

function sum(){
    let s=$1+$2
    echo $s
}

a=`sum 100 200`
echo $a


运行结果:
┌──(root㉿kali)-[~]
└─# bash sum1.sh
300

示例(求任意一个数的阶乘):

bash 复制代码
#!/bin/bash

if [ $# -ne 1 ];then
    echo "输入有误,程序退出"
    exit 3
    #随便定义,表示退出的状态
fi

#这里采用递归算法来实现

function jc(){
    n=$1
    if [ $n -le 1 ];then
        echo 1
        return 0
    elif [ $n -gt 1 ];then
        let pre_n=n-1
        temp=`jc $pre_n`
        let result=n*temp
        echo $result
        return 0
    fi
}

jc $1

运行结果:

十,shell工具

1,cut

基本语法:

cut [选项参数] filename

说明:默认分隔符是制表符

选项:

示例:

尝试对/etc/passwd操作;

拿到用户名和组名;

2,sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为**"模式 空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一 行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。**

基本语法:

sed [选项参数] 'command' filename

选项:

command:

示例:

只是保存在缓冲区中;

想要保存在内存中,需要加-i选项;

删除指定内容;

3,awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。(功能非常强大)

基本语法:

awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename

pattern:表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

选项:

内置变量:

示例:

切割IP地址;

bash 复制代码
ifconfig | awk '/inet / {print $2}'

4,sork

将文件进行排序,并将排序结果标准输出。

基本语法:

sort(选项)(参数)

选项:

示例:

默认的排序(按照字符的字典顺序):

将第三个字段按照顺序排序(数字顺序):

十一,总结

优点 描述
简洁易用 Shell语言简单易学,许多操作系统任务可通过短小的脚本或一行命令实现。
快速原型开发 Shell语言允许快速编写脚本来测试和验证想法,而无需构建完整的应用程序。
与操作系统紧密集成 Shell语言可直接访问操作系统的命令和工具,以便在文件系统、进程管理和系统监控等方面执行任务。
良好的任务自动化 Shell语言可用于编写自动化脚本,处理日常任务,如备份、日志分析和系统维护。
可扩展性 Shell脚本可以与其他编程语言(如Python、Perl和Ruby)结合使用,进一步扩展功能。
相关推荐
duliduli121915 分钟前
当遇到 502 错误(Bad Gateway)怎么办
网络安全
TIKTOKER217 分钟前
当遇到 502 错误(Bad Gateway)怎么办
网络安全
wdxylb20 分钟前
Linux下编写第一个bash脚本
开发语言·chrome·bash
Gnevergiveup35 分钟前
源鲁杯2024赛题复现Web Misc部分WP
安全·网络安全·ctf·misc
Yue1one3 小时前
CSRF 点击劫持
web安全·网络安全
网安_秋刀鱼3 小时前
CSRF防范及绕过
前端·安全·web安全·网络安全·csrf·1024程序员节
Peter4474 小时前
-bash: ./my_rename.sh: /bin/bash^M: bad interpreter: No such file or directory
开发语言·bash
小麦黑客笔记5 小时前
2024年最新自学手册 -网络安全(黑客技术)
开发语言·网络·安全·web安全·网络安全