什么是shell
shell作用:保护内核
c/c++:编译型语言,需要使用编译器,执行速度相对快,不可以直接和内核交互
shell:解释型语言,需要使用解析器,执行速度相对慢,可以直接和内核交互
shell本质就是指令的集合,但是指令需要满足一定的逻辑关系,在使用解析器解析脚本文件是,按照一定的逻辑关系进行执行。
shell脚本的创建
格式:
vim ***.sh
#!+Tab补全
例:#! /bin/bash
#!:表示这是一个脚本文件
/bin/bash :使用的解析器bash
注释:
#:单行注释
shell没有多行注释,但是可以使用指令模拟多行注释
<<A
多行注释的文本
A
bash解析器
查看使用的解析器:
- echo $SHELL
- cat /etc/shells
bash:用于ubuntu和debian操作
sh:最早的解析器,和终端交互差
dash:类似sh
csh:类似C语言,需要许可证
运行:
- bash ***.sh //可以不具备可执行权限,在当前终端下的终端运行,把结果返回给当前终端
- chmod 777 ***.sh //需要具备可执行权限,在当前终端下的终端运行,把结果返回给当前终端
./***.sh
- 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
特殊符号
- readonly 只读
readonly a=100
- unset 取消变量(不能取消只读类型的变量)
unset 变量
- 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
- str0的数组长度不够大,会发生越界
- strl==10的情况也会发生越界
简述数组合指针的区别
数组是使用一段连续的存储空间存储类型相同的构造类型,存储的是数据
指针是指向数据的,指针是变量的地址
static全局变量和普通全局变量的区别,static局部变量和普通局部变量的区别,static函数和普通函数的区别
static全局变量类型是static,普通全局变量类型默认是extern
static全局变量类型是static,普通全局变量类型默认是auto,static全局变量内存在静态区,普通全局变量内存在栈区,static局部变量,延长生命周期本文件有效,普通函数到作用域有效
static函数类型是static,普通函数类型默认是extern,static函数,会延长生命周期到本文件有效,static函数不能跨文件调用。