Linux Shell:基础知识和Shell变量
摘要:Linux
,Shell
整理Shell内容要点:
- Shell基础知识
- Shell变量的类型
- Shell变量赋值
- 数值和小数变量运算
- 字符串变量操作,截取,替换和替代
Linux和Shell基础知识要点
-
Shell是链接用户和Linux内核的桥梁
: 用户不能直接接触内核,因此需要一种命令解释器,即简化用户操作,又保障内核安全,这个命令解释器就是Shell -
Shell运行的实质是调用Linux内核暴露出的接口
:用户只感觉到Shell命令执行而看不到背后运行的操作都是内核实现
-
Shell是编程语言
:Shell不仅是 命令,也是编程语言,适合开发实用的,自动化的小工具,而不是开发大型应用,Shell是一种解释型语言,边执行边翻译,不需要编译 -
Shell有多版本
:Linux的默认版本是Bash Shell,查看环境变量$SHELL可以查看当前运行的版本
$ echo $SHELL
/bin/bash
Shell变量
(1)变量类型
变量类型根据定义方式分为自定义变量,环境变量,位置变量和预定义变量
-
自定义变量
:也称作局部变量或者普通变量,只能在创建他们的Shell脚本或者函数中使用,使用=
赋值,使用$
,${}
引用 -
环境变量
:全局变量,可以在创建他们的Shell
l脚本或者相关的其他脚本中使用,使用export
赋值,$
,${}
引用 -
位置变量
:用于命令行,函数,脚本传参中,根据参数的位置拿到变量,$1
代表第一个参数,$2
第二个以此类推,$0
代表命令本身或者脚本名 -
预定义变量
:是预先定义好可以直接使用的变量使用规则,对Shell脚本通用,比如获得参数个数$#
,获得所有参数$@
等,位置变量是一种特殊的预定义变量,预定义变量如下
预定义变量 | 说明 |
---|---|
$0 | 脚本名 |
$* | 所有的参数 |
$@ | 所有的参数 |
$# | 参数的个数 |
$$ | 当前进程的PID |
$! | 上一个后台进程的PID |
$? | 上一个命令的返回值,成功表示0 |
备注:$@和$*都是输出所有传入的参数,一般情况下都会把参数依据空格一个一个拆开单独引用,当对着两个预定义变量加了双引号后"$@"和"$*","$*"会把所有参数和空格作为一个整体串,"$@"依旧会保持独立的结构
(2)变量赋值
变量的赋值有多种方法,最常见的就是直接赋值,使用=
赋值,这个=不是数学中相等的符号而是赋值符号,=左右禁止有空格
a=3
还可以使用命令行传参进行变量赋值,比如通过位置变量赋值变量a,b
root@ubuntu:~# cat test.sh
#!/bin/bash
a=$1
b=$2
echo $a
echo $b
root@ubuntu:~# bash test.sh a b
a
b
在命令行中传参使用空格符进行分割,如果参数里面存在空格,使用双引号包裹起来
root@ubuntu:~/Shell# bash test.sh 1 "2 3"
1
2 3
root@ubuntu:~/Shell# bash test.sh 1 "2 3"
1
2 3
另一种使用较多的是使用命令的输出结果进行赋值,使用反向单引号
进行赋值,也可以使用$()
root@ubuntu:/home# a=`pwd`
root@ubuntu:/home# echo $a
/home
root@ubuntu:/home# b=$(pwd)
root@ubuntu:/home# echo $b
/home
单引号,双引号,反引号的区别
-
单引号
(''
):单引号输出纯字符串,不管其中带有表达式还是变量,都是字符串原样输出 -
双引号
(""
):双引号会把字符串中的变量,函数,表达式先解析成结果再输出 -
反引号
(``):反引号是命令表达式,如果存在与字符串中先会解析成表达式的结果
变量删除
变量赋值之后使用unset
进行删除,删除之后再次引用会得到空字符串
root@ubuntu:~/Shell# echo $a
whosyourdaddy
root@ubuntu:~/Shell# unset a
root@ubuntu:~/Shell# echo $a
(3)变量运算
Shell中变量是字符串类型,不能直接计算,如果需要进行计算需要使用特殊的方法,Shell进行变量运算的方法有expr
,(())
,$[]
expr数值运算命令
expr主要用于整数运算,不支持小数计算,乘法需要加转移符\
root@ubuntu:~/Shell# cat expr.sh
#!/bin/bash
expr 1 + 22 # 23
expr 6 / 3 # 2
expr 3 \* 123 # 369
expr 5 - 2 # 3
如果使用expr计算小数运算,会报错语法不支持
root@ubuntu:~/Shell# expr 3 \* 3.14
expr: non-integer argument
(())和[]数值运算命令
(())和[]作用是对整数数值进行运算和比较的,效率较高是企业应用中常见的操作符,括号内部允许有空格,如果是用作运算并获得运算值,需要在(())和[]前面加$,乘法不需要转移符
echo $((2 * 3)) # 6
echo $((2 + 3)) # 5
echo $((6 / 3)) # 2
echo $((6 - 3)) # 3
echo $[2 * 3] # 6
echo $[2 + 3] # 5
echo $[6 / 3] # 2
echo $[6 - 3] # 3
let数值运算
let也只能对整数数值变量进行运算,乘法不需要转义,和expr,(())和[]不同,let不能在=和运算符之间不能带有空格,let的运算结果不能回显功能,不能使用$引用
root@ubuntu:~/Shell# a=3
root@ubuntu:~/Shell# let a=a+6
root@ubuntu:~/Shell# echo $a
9
root@ubuntu:~/Shell# let a=a*2/6
root@ubuntu:~/Shell# echo $a
3
使用bc计算机进行小数数值计算
bc是linux下交互式的计算器,敲入bc命令即可进入,默认对结果值保留0位小数,需要设置scala值保留位数,输入quit退出
root@ubuntu:~/Shell# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5/2
2
scale=1
5/2
2.5
quit
可以使用bc计算器对变量赋值,但是效率较低,应用较少
root@ubuntu:~/Shell# a=`echo 3+3|bc`
root@ubuntu:~/Shell# echo $a
6
加入小数位数进行赋值
root@ubuntu:~/Shell# a=`echo "scale=1;3/2"|bc`
root@ubuntu:~/Shell# echo $a
1.5
(4)字符串变量操作
- 获取字符串变量长度
获取字符串长度,就是字符长度,使用${#变量}
获取,{}不能省,要不然先解析$#
root@ubuntu:~/Shell# a=whosyourdaddy
root@ubuntu:~/Shell# echo ${#a}
13
- 字符串变量截取
下一步对字符串变量进行索引截取,可以指定从第几个字符开始,往后几个字符为止,在变量后使用两个冒号指定
${var:index:length}
root@ubuntu:~/Shell# echo $a
whosyourdaddy
root@ubuntu:~/Shell# b=${a:2:4}
root@ubuntu:~/Shell# echo $b
osyo # 从第二个索引为止开始往后一共4个字符
其中两个冒号后面的值可以省略其中一个,如果省略第一个索引为止则默认从0开始,往后一定长度
root@ubuntu:~/Shell# echo ${a::7}
whosyou
省略后面一个值则默认一直到字符串结尾
root@ubuntu:~/Shell# echo ${a:7}
rdaddy
- 字符串字符替换
字符串变量对其中某些字符进行替换,使用/的//的固定用法
# 替换第一个符合要求的字符
${var/substring/newstring}
# 替换所有符合要求的字符
${var//substring/newstring}
root@ubuntu:~# a=whosyourdaddy
root@ubuntu:~# b=${a//d/D}
root@ubuntu:~# echo $b
whosyourDaDDy
root@ubuntu:~# b=${a/d/D}
root@ubuntu:~# echo $b
whosyourDaddy
-
字符串字符的空值替代
当变量没有被赋值就直接使用时会是空字符串,可以使用如下语句替代空字符串,使得变量如果没有被赋值就设置一个默认值
${var-newstring}
下面这个例子将变量值写入config.yml作为配置文件,如果变量没有赋值就设置默认值
root@ubuntu:~/Shell# echo "mysql_host:${mysql_port-192.168.67.72}" >> config.yml
root@ubuntu:~/Shell# echo "mysql_port:${mysql_port-3306}" >> config.yml
root@ubuntu:~/Shell# cat config.yml
mysql_host:192.168.67.72
mysql_port:3306
(5)数值变量自增
数值变量使用++
进行自增,++配合变量和let
数值计算使用,++var
代表先自增再赋值,var++
代表先赋值再自增,如果不赋值没啥区别
root@ubuntu:~/Shell# i=1
root@ubuntu:~/Shell# let i++
root@ubuntu:~/Shell# echo $i
2
root@ubuntu:~/Shell# let ++i
root@ubuntu:~/Shell# echo $i
3
如果对一个空字符串或者非数值字符串进行++,则直接++为1,相当于默认原始值为0
root@ubuntu:~/Shell# i=ww
root@ubuntu:~/Shell# let i++
root@ubuntu:~/Shell# echo $i
1
当对++之后的值赋值给一个新的变量时,++在左在右结果就不同了
root@ubuntu:~/Shell# a=5
root@ubuntu:~/Shell# let b=a++
root@ubuntu:~/Shell# let c=++a
root@ubuntu:~/Shell# echo $b
5 # 先赋值,再++,直接赋值为原始的5
root@ubuntu:~/Shell# echo $c
7 # a经过两次自增,第二次是先++再赋值