Shell脚本中的表达式和流程控制
表达式运算符$(())或者$[]都可以用来在内部写表达式,运算操作符。
判断语句[ condition ](condition前后要有空格)非空返回true判断字符串相等,用=。
12345678910111213141516if [ "ok" = "ok" ]then echo 'equal"elif [ 条件判断式 ]thenfi## case语句case $变量 in"变量1")执行命令;;"变量2")执行命令2;;esac
for循环123456789101.for 变量 in 值1 值2 值3.。。do程序/代码done2.for(( 初始值;循环控制条件;变量变化))do程序/代码done
while循环1234while [ 条件判断式 ]do 程序done
读取控制台输入read (选项)(参数)-p:指定读值时的提示符。-t:指定读取值时等待的秒数。如果一定时间内没输入,就退出。
12read -p "请输入一个数Num1=" NUM1re ...
Shell脚本:命令解释和脚本编写
shell是一个命令解释器,用来向内核发送请求。通过写shell脚本,通过shell执行。(bashshell)
脚本格式#!/bin/bash开头脚本要有执行权限。或者使用sh来执行脚本,他可以不需要执行权限。sh hello.sh
定义变量A=100调用该变量时需要使用$
1234567891011121314A=100echo A=$Aecho "A=$A"#这两个的输出结果是一样的。都是A=100#只有$A才会被解析#撤销变量unset A#声明静态变量#只会定义一次,不会被反复初始化。而且不能被unsetreadonly B=2#在shell中,等号两侧不允许又空格## 将命令的返回值返回出去A=`data` or A=$(data)#其中data是命令。
定义全局变量export。可以在/etc/profile中写入。然后通过source命令刷新。也可以部分权限。写入bashrc中也可以所谓全局变量,就是指变量在当前的整个 Shell 进程中都有效。每个 Shell 进程都有自己的作用域,彼此之间互不影响。在 Shell 中 ...
作用域链与变量声明
作用域及作用链
全局作用域;
函数作用域;
块级作用域;
全局作用域全局作用域的变量可以在程序任意位置访问到。
123456var greeting = 'Hello World!';function greet() { console.log(greeting);}// 打印 'Hello World!'greet();
函数作用域函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问。
块级作用域ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中.在大括号之外不能访问这些变量。
12345678910{ // 块级作用域中的变量 let greeting = 'Hello World!'; var lang = 'English'; console.log(greeting); // Prints 'Hello ...
nginx 部署前后端错误记录
记录两个错误1在我部署了一个前端页面到服务器上的nginx后,我访问他报错403.显示没有权限。后来发现403的一个可能原因是因为nginx没有权限访问到/root中的内容。因为我把vue打包的页面直接放到了root目录下。因此报错,只要将这个dist文件放到其他位置即可正常访问了
2vue部署了路由的话,再部署到nginx上需要为vue的路由专门配置
12345location / { root html/dist; index index.html; try_files $uri $uri/ /index.html;#解决页面刷新 }
同时因为vue的代理服务器只在运行时才有用。因此需要再nginx部署代理服务器。或者再后端解决跨域问题。这里介绍再nginx解决代理的方法。
123456789101112location /api/ { # 单个服务 proxy_pass http://127.0.0. ...
路由守卫栈内存溢出处理
路由补充RangeError: Maximum call stack size报以上错误。其大意是说栈内存溢出。以下是我写的代码
12345router.beforeEach((to,from,next)=>{ if(!localStorage.getItem("token")){ next("/login") }})
现在分析一下。假设他跳转到login页面,然后他会判断是否有token,判断完成,他将眺望login页面。跳转之后他又会进行判断是否又token
因为他不是next(),按照他的流程接着跳转。而是采用了next(“/login”),表示他会重新发起一次跳转,也就是会再过一遍路由守卫。因此他会堆栈溢出而报错。修改后的代码可以改为
123456789router.beforeEach((to,from,next)=>{ if(to.path==="/login"){ next( ...
Get-Post请求参数区别
主要解决问题为get请求,post请求,params参数,data参数的区别和联系。
首先Get请求不能携带请求体,服务器接收到Get请求后,会默认忽视掉Get请求的请求体。也就是Get请求只能携带params参数,这个参数会直接跟在请求地址后面,组成一个字符串。
post请求既可以使用params请求,也可以携带data参数,data的参数会放在payload中。springboot需要获取post发送的payload需要通过@RequestBody来获取。
路由模式:hash与history
hash模式,history模式hash模式:他不会像服务器发送hash值,也就是#后面的内容不会发送到服务器中。history模式:会将路径内容发送到服务器中
路由守卫:全局、独享、组件内
路由守卫需要在路由中进行配置
全局路由前置1234567全局前置路由守卫//切换路由或者初始化的时候都会调用一次//to:前往的地址。from:过来的地址。next:是否允许前往,调用后即放行route.beforeEach((to,from,next)=>{ next()//允许放行})
可以在路由中的meta属性中添加属性。来选择那些路由需要鉴权。哪些不需要鉴权。
后置1234567全局前置路由守卫//切换路由或者初始化的时候都会调用一次//to:前往的地址。from:过来的地址。next:是否允许前往,调用后即放行route.afterEach((to,from)=>{ })
独享路由守卫在每个子路由内使用beforeEnter: (to,from,next)=>{}他的逻辑和全局路由守卫一样,但是他只写在单个子路由内。而且独享路由守卫只有前置路由守卫。
组件内路由守卫
浏览器路由导航:Push vs Replace
路由2浏览器历史记录有两种方式push:不会删去刚刚的页面,而是添加新的页面记录,像压栈一样去记录replace:直接替换掉刚刚的页面记录。浏览器默认为push操作再router-link中添加一个属性:replace="true"他会将改点击事件记录为replace操作
编程式路由导航即不通过router-link即不适用a标签。而是通过写方法于button绑定之类的方法。关键方法:this.$router.push({})这里通过实现router的push方法跳转页面,也可以使用replace方法进行跳转。同样的push中的对象就是to的对象时写法。有name,path,params,query参数。
两种方法。$router.back()后退页面,¥router.forword()页面前进
Vue路由基础
VueRouter路由vue使用路由先安装vuerouter,同样的,vue2使用vuerouter3,vue3使用vuerouter4。新建一个路由,再src下建一个router文件夹,写一个index.js。
123456789101112131415161718import VurRouter from 'vue-router'//引入组件import About from '../component/About'import Home from '../component/Home'//创建一个路由器export default new VueRouter({ routes:[ { path:'/about', component:About }, { path:'/home', component:Hmoe } ...