1shell基础,变量,运算符
1shell基础语法
是一个命令解释器,在操作系统的最外层,负责直接与用户进行对话。
我们输入的命令,计算机时不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时把计算机生成的结果返回给我们
shell脚本,就是我们吧原先的linux命令或语句以及相关的语法组合放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为shell脚本
编程语言分类
低级语言(面向机器的语言)
- 机器语言:二进制语言
- 汇编语言:符号语言
高级语言
- 静态语言,编译型语言 如c,c++,java
- 动态语言,解释型语言 如php,shell,python
gcc编辑器将人类理解的语言翻译成机器理解的语言
简单shell脚本
[root@meditation ~]# cat test.sh
#!/bin/bash
#this is shell
echo "hello world"
touch /tmp/a.txt
两种执行脚本方式
[root@meditation ~]# chmod +x test.sh
[root@meditation ~]# ./test.sh
hello world
[root@meditation ~]# bash test.sh
hello world
2变量
变量是shell传递数据的一种方法
我们可以吧变量当成一个容器,通过变量可以在内存中存储数据,也可以在脚本执行中修改和访问存储的数据
变量有数字,字母,和下划线组成,区分大小写, 不能以数字开头
等号用于变量分配,在使用过程中等号两边不能有空格
当对变量赋值的类型是字符串时,需要用引号括起来
要对变量进行调用时,在变量名前加美元符号$
按照作用分类
1用户自定义变量,
2环境变量,主要保存的是和系统操作环境相关的数据
3位置参数变量,这种变量主要用来向脚本当中床底参数或数据,变量名不能自定义,变量作用是固定的
4预定义变量,是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
按照变量作用域分类
- 全局变量,是环境变量,值不随着shell脚本的执行结束而消失
- 局部变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其他程序不可见,包括:自定义变量,位置参数变量,预定义变量
2.1用户自定义变量
规则
- 变量名由字母,数字,下划线组成,
- 不允许使用数字开头,等号两边不允许有空格
- 区分大小写
- 在使用变量时,在变量名前加$
举例
例1,等号两边不能有空格
[root@meditation ~]# var1 = 123
-bash: var1: command not found
[root@meditation ~]# var1=123
[root@meditation ~]# echo $var1
123
例2,变量值的叠加,使用${}
$name是${name}的简化版本,在某些情况下,还必须使用花括号引起的方法来消除歧义
[root@meditation ~]# var2=mysql
[root@meditation ~]# echo $var2db.log
.log
[root@meditation ~]# echo ${var2}db.log
mysqldb.log
例3,命令的替换,使用$()或者反引号)
[root@meditation ~]# echo $date
[root@meditation ~]# echo $(date "+%F")
2019-06-28
[root@meditation ~]# echo `date "+%F"`
2019-06-28
例4,命令的嵌套使用$( $())
[root@meditation ~]# var3=$(tar zcvf sh.tar.gz $(find /root/*.sh))
tar: 从成员名中删除开头的“/”
shell中单引号和双引号的区别
单引号之间的内容原封不动赋值给变量,双引号之间的内容如有特殊符号会保留它的特殊含义
'' 所见即所得,原样输出.
"" 如果内容中有命令,变量等,会先把变量,命令解析出结果,然后在输出最终内容来。
[root@meditation ~]# echo 'this is $var2'
this is $var2
[root@meditation ~]# echo "this is $var2"
this is mysql
- \ 转义符,跟在\后面的特殊符号将失去特殊含义,变为普通字符
[root@meditation ~]# echo $var2
mysql
[root@meditation ~]# echo \$var2
$var2
删除变量
[root@meditation ~]# unset var2
[root@meditation ~]# echo $var2
[root@meditation ~]#
2.2环境变量
在bash shell中,环境变量分为两类,全局变量和局部变量
- 全局变量:对于shell会话和所有的子shell都是可见的
- 局部变量:它只在自己的进程中
查看所有全局变量
[root@meditation ~]# env
export设置全局变量
[root@meditation ~]# var4=xuegod4
[root@meditation ~]# export var5=xuegod5
[root@meditation ~]# cat ./test.sh
#!/bin/bash
echo $var4
echo $var5
[root@meditation ~]# bash ./test.sh
xuegod5
var4是局部变量,执行脚本时,重新打开了一个子shell,在这里面时获取不到的
var5通过export设置为全局变量,在子shell中也是可见的
变量永久生效
[root@meditation ~]# env |grep var5
var5=xuegod5
虽然我们设置了export全局变量,但是新开的xshell连接中,还是读不到变量var5
让变量永久生效,可以把定义好的变量写入配置文件
当登录系统或新开一个ssh连接来启动bash进程时,会加载这4个配置文件
如果在多个文件中设置不同的值,以最后执行的文件为准
| 配置文件 | 描述 | 优先级 |
|---|---|---|
| /etc/profile | 系统全局环境和登录系统的一些配置 | 1 |
| /etc/bashrc | bash全局自定义配置文件,用于定义bash | 2 |
| /root/.bashrc | 用于单独自定义某个用户的bash | 3 |
| /root/.bash_profile | 用户单独自定义某个用户的系统环境 | 4 |
设置PATH环境变量
PATH变量是用来定义bash查找命令的目录
当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个PATH路径内,就可以在全局调用这个第三方程序
[root@meditation ~]# cat /opt/backup.sh
#!/bin/bash
echo "Backup data is OK!"
[root@meditation ~]# chmod +x /opt/backup.sh
[root@meditation ~]# backup.sh
-bash: backup: command not found
[root@meditation ~]# PATH=/opt/:$PATH
[root@meditation ~]# backup.sh
Backup data is OK!
也可以将PATH=/opt/:$PATH加入到上述配置文件结尾处.source重新加载文件,即可生效
2.3位置变量
- $0 ---- 代表命令本身
- $1-9 ---- 代表接受的第1-9个参数,10以上需要用{}括起来,比如${10}代表接收的第10个参数
- $* ---- 代表接收所有的参数,将所有参数看作一个整体
- $@ ---- 代表接收的所有参数,将每个参数区别对待
- $# ---- 代表接收的参数个数
[root@meditation ~]# cat print.sh
#!/bin/bash
echo "文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "所有参数:$@"
echo "总共参数数量:$#"
[root@meditation ~]# bash ./print.sh 1 2 3 4
文件名:./print.sh
第一个参数:1
第二个参数:2
第三个参数:3
所有参数:1 2 3 4
总共参数数量:4
预定义变量
有些变量一开始执行script脚本时就会设定,且不能更改,但是我们不叫他只读的系统变量.而叫做特殊变量,或者是预定义变量
| 变量 | 描述 |
|---|---|
| $* | 以一个但单字符串,显示所有向脚本传递的参数 |
| $# | 传递到脚本参数的个数 |
| $$ | 当前进程的进程号PID |
| $? | 线束最后命令的退出状态,0表示没有错误,其他值表明有错误或者其他 |
| $! | 后台运行的最后一个进程的进程号PID |
3expr命令和数学运算符
数学运算
[root@meditation ~]# expr 3 \> 5
0
[root@meditation ~]# expr 6 \> 5
1
[root@meditation ~]# expr 6 \* 5
30
字符串操作
[root@meditation ~]# expr length "ni hao" #获取长度
6
[root@meditation ~]# expr substr "ni hao" 2 4 #截取字符串
i ha
| 运算符 | 含义 |
|---|---|
| ++ -- | 递增及递减,可前置亦可后置 |
| + - ! ~ | 正负,逻辑取反 |
| + - * / % | 加 减 乘 除 取余 |
| < <= > >= | 比较大小 |
| == != | 相等 不相等 |
| << >> | 向左位移 向右位移 |
| & , ^ , | | 与,异或,或 |
| &&,|| | 逻辑与,逻辑或 |
| ? : | 条件判断 |
1shell基础,变量,运算符的更多相关文章
- python基础-变量运算符(3)
一.注释 注释就是对代码的解释和说明.目的是为了让别人和自己很容易看懂.为了让别人一看就知道这段代码是做什么用的.正确的程序注释一般包括序言性注释和功能性注释.序言性注释的主要内容包括模块的接口.数据 ...
- Java基础-比较运算符Compare Operators
Java基础-比较运算符Compare Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关系运算符 关系运算符包括: 1>.大于(>) 2> ...
- Java基础-算术运算符(Arithmetic Operators)
Java基础-算术运算符(Arithmetic Operators) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java程序通过运算符实现对数据的处理,Java中的运算符包括: ...
- Java基础-位运算符Bitwise Operators
Java基础-位运算符Bitwise Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算特点 位运算符分为按位与(&),按位或(|),按位异或(^ ...
- Python 基础 常用运算符
Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...
- C语言基础知识-运算符与表达式
C语言基础知识-运算符与表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用运算符分类 1>.算术运算符 用于处理四则运算. 2>.赋值运算符 用于将表达式的 ...
- 前端知识体系:JavaScript基础-变量和类型
前端工程师自检清单 1. JavaScript规定了几种语言类型 2. JavaScript对象的底层数据结构是什么 3. Symbol类型在实际开发中的应用.可手动实现一个简单的 Symbo 4. ...
- java基础2_运算符,选择语句
算数运算符 + 相加 字符串的连接 正数 - 相减 负数 * 相乘 / 相除 10 / 3 ==> 3 两个操作数中精度最高的是int 结果也是int % ...
- [.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
随机推荐
- ROS报错:IOError:[Errno 13]permission denied: /home/neousys/.ros/roscore-11311.pid"
在安装ROS后启动ROS,输入:roscore 时报错: 这个问题是由于该路径下ros文件权限造成的. 输入以下命令修改权限: sudo chmod -R ~/.ros/ 修改完成后再次输入rosco ...
- D - Denouncing Mafia DFS
这道题其实很简单,求k个到根的链,使得链上的节点的个数尽可能多,如果节点被计算过了,就不能再被计算了,其实我们发现,只要k>=叶子节点,那么肯定是全部,所以我们考虑所有的叶子节点,DFS到根节点 ...
- 利用伪类选择器与better-scroll的on事件所完成的上拉加载
之前给大家分享过一篇上拉加载 利用了better-scroll的pullUpDown 和DOM元素的删除添加 感觉那样不太好 今天给大家分享一个不同的上拉加载思想 代码如下 class List { ...
- poj 3159 Candies (dij + heap)
3159 -- Candies 明明找的是差分约束,然后就找到这题不知道为什么是求1~n的最短路的题了.然后自己无聊写了一个heap,518ms通过. 代码如下: #include <cstdi ...
- 第三期 行为规划——11.在C ++中实现第二个成本函数
在大多数情况下,单一成本函数不足以产生复杂的车辆行为.在这个测验中,我们希望您在C ++中实现更多的成本函数.我们稍后会在本课中使用这两个C ++成本函数.这个测验的目标是创建一个成本函数,使车辆在最 ...
- props & children
一. choosing the type at runtime import React from 'react'; import { PhotoStory, VideoStory } from '. ...
- 学习CSS预处理器Less
1.Sass与Less的区别:Sass与Less的区别 2.Less的使用:Less的使用 3.Less的相关网址:Less.js.Less中文网 Less的HSL函数-lighten():HSL函数 ...
- SQL 三个表练习(student,teacher,score)
- [转]【译】.NET Core 3.0 中的新变化
.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...
- vue+element-ui 字体自适应不同屏幕
项目背景:屏幕自适应问题,当在不同分辨率的屏幕上显示页面时,页面的字体需要根据屏幕大小来自适应,想到使用rem作为字体的单位 vue-cli脚手架下的index.html中写入以下js脚本 <s ...