其他开发工具

Linux Shell:基础知识和Shell变量

2021-08-05  本文已影响0人  xiaogp

摘要:LinuxShell

整理Shell内容要点:


Linux和Shell基础知识要点

$ echo $SHELL
/bin/bash

Shell变量

(1)变量类型

变量类型根据定义方式分为自定义变量,环境变量,位置变量和预定义变量

预定义变量 说明
$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经过两次自增,第二次是先++再赋值
上一篇下一篇

猜你喜欢

热点阅读