shell脚本

什么是shell

shell作用:保护内核

c/c++:编译型语言,需要使用编译器,执行速度相对快,不可以直接和内核交互

shell:解释型语言,需要使用解析器,执行速度相对慢,可以直接和内核交互

shell本质就是指令的集合,但是指令需要满足一定的逻辑关系,在使用解析器解析脚本文件是,按照一定的逻辑关系进行执行。

shell脚本的创建

格式:

vim ***.sh

#!+Tab补全

例:#! /bin/bash

#!:表示这是一个脚本文件

/bin/bash :使用的解析器bash

注释:

#:单行注释

shell没有多行注释,但是可以使用指令模拟多行注释

<<A

多行注释的文本

A

bash解析器

查看使用的解析器:

  1. echo $SHELL
  2. cat /etc/shells

bash:用于ubuntu和debian操作

sh:最早的解析器,和终端交互差

dash:类似sh

csh:类似C语言,需要许可证

运行:

  1. bash ***.sh //可以不具备可执行权限,在当前终端下的终端运行,把结果返回给当前终端
  2. chmod 777 ***.sh //需要具备可执行权限,在当前终端下的终端运行,把结果返回给当前终端

./***.sh

  1. source ***.sh //可以不具备可执行权限,在当前终端下运行

修改环境变量

查看环境变量:

env

对当前终端有效:

对PATH添加指令路径

export PATH=$PATH : 指定路径

添加权限

chmod 777***.shx

直接执行

***.sh

对当前用户有效:重点

在~/.bashrc文件重添加指令路径

export PATH=$PATH : 指定路径

使修改的文件生效

source ~/.bashrc 或者重启

为文件添加可执行权限

chmod 777***.shx

接执行

***.sh

对所有用户有效:

在/etc/bash.bashrc文件重添加指令路径

export PATH=$PATH : 指定路径

使修改的文件生效

source /etc/bash.bashrc 或者重启

为文件添加可执行权限

chmod 777***.shx

接执行

***.sh

对所有用户有效:重点

在/etc/enviroment文件重添加指令路径

export PATH=$PATH : 指定路径

使修改的文件生效

source /etc/enviroment 或者重启

为文件添加可执行权限

chmod 777***.shx

接执行

***.sh

shell变量

shell变量的定义格式

shell变量没有数据类型,默认是字符串

shell变量默认是全局变量

格式:

变量= //定义了变量值为空

变量=初始化的值 //定义变量值为初始化的值

*错误示范:变量 //默认是个指令

shell变量的定义以及初始化

=号的左右俩端不允许存在空格

*初始化的值没有空格

格式:

变量=初始化的值

变量='初始化的值'

变量="初始化的值"

*初始化的值存在空格

格式:

变量='初始化的值'

变量="初始化的值"

使用变量对另一个变量初始化

a=hello

b=$a //b=hello

b='$a' //b=$a

b="$a" //b=hello 建议使用

shell变量的引用

格式:

$变量

${变量} 建议使用

练习:

定义两个变量初始化,实现交换

位置变量

位置变量:类似C语言的argc argv ,用来接收外部输入的字符串,主要用于shell中函数的传参

功能:获取外部传参的值

$0 //文件名

$1 //终端输入的第一个字符串

$2 //终端输入的第二个字符串

$3 //终端输入的第三个字符串

......

$10 //第一个字符串后面加0

${10} //第十个字符串

......

${n} //第n个字符串

练习:

定义三个变量赋值为终端输入的字符串,实现三个字符串的交换

预定义变量

预定义变量:系统自带的变量,

$* //终端输入的所有字符串,不包括文件名

$@ //终端输入的所有字符串,不包括文件名

$# //终端输入的字符串个数

$$ //当前终端的进程号

$? //获取上一行指令的结果,如果上一行指令成功则为0,失败则为非0,多用于接受函数的返回值类似return

命令置换

命令置换:把指令的结果赋值给变量

格式:

变量=$(指令)

变量=`指令`

练习:

定义变量a赋值为当前用户,b赋值为用户id,c=用户组id

特殊符号

  1. readonly 只读

readonly a=100

  1. unset 取消变量(不能取消只读类型的变量)

unset 变量

  1. local 定义局部变量

练习 

 用递归实现斐波那契数列

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fei(int n)
{
    if (1==n||2==n)
        return 1;
    else
        return fei(n-1)+fei(n-2);
}
int main(int argc, const char *argv[])
{
    int n;
    scanf("%d",&n);
    fei(n);
    for(int i=1;i<=n;i++)
    {
    printf("%d ",fei(i));
    }
    putchar(10);                                  
    return 0;
}     

 countx=8

计算讲x转换为二进制后含有1的个数,x=x&(x-1)表示把二进制最右侧的1变为0

  1. str0的数组长度不够大,会发生越界
  2. strl==10的情况也会发生越界

 简述数组合指针的区别

数组是使用一段连续的存储空间存储类型相同的构造类型,存储的是数据

指针是指向数据的,指针是变量的地址

 static全局变量和普通全局变量的区别,static局部变量和普通局部变量的区别,static函数和普通函数的区别

static全局变量类型是static,普通全局变量类型默认是extern

static全局变量类型是static,普通全局变量类型默认是auto,static全局变量内存在静态区,普通全局变量内存在栈区,static局部变量,延长生命周期本文件有效,普通函数到作用域有效

static函数类型是static,普通函数类型默认是extern,static函数,会延长生命周期到本文件有效,static函数不能跨文件调用。

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值