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基础,变量,运算符)