linux之shell基础

1.变量替换和测试

  变量替换

    语法              说明

    ${变量名#匹配规则}       从变量开头进行规则匹配,将符合最短的数据删除

    ${变量名##匹配规则}       从变量开头进行规则匹配,将符合最长的数据删除

    ${变量名%匹配规则}        从变量尾部进行规则匹配,将符合最短的数据删除

    ${变量名%%匹配规则}       从变量尾部进行规则匹配,将符合最长的数据删除

    ${变量名/旧字符串/新字符串}   变量内容替换,将第一个匹配到的旧字符串替换成新字符串

    ${变量名//旧字符串/新字符串}     变量内容替换,将匹配到的所有旧字符串都替换成新字符串

 

  变量测试

变量配置方式 str没有定义 str为空字符串 str已定义且非空
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} var=expr var= var=$str
var=${str:=expr} var=expr var=expr var=$str

2.字符串

  计算字符串长度

  语法 说明
方法一 ${#string}
方法二 expr length "$string" string中有空格时,必须加双引号

    举例:

      [root@VM_0_13_centos ~]# var="Hello World"
      [root@VM_0_13_centos ~]# len=${#var}
      [root@VM_0_13_centos ~]# echo $len
      11
      [root@VM_0_13_centos ~]# len=$(expr length "$var") 
      [root@VM_0_13_centos ~]# echo $len                
      11

  获取子串在字符串中的索引位置

    语法  expr index $string $substring

    说明  下标从1开始

        会将substring子串拆分成一个个字符,然后去匹配string字符串中是否有这些字符,返回最先找到的那个字符的位置

    举例

      [root@VM_0_13_centos ~]# var="quickstart is app"
      [root@VM_0_13_centos ~]# index=$(expr index "$var" uniq)
      [root@VM_0_13_centos ~]# echo $index
      1
      [root@VM_0_13_centos ~]# index=$(expr index "$var" cnk)
      [root@VM_0_13_centos ~]# echo $index
      4

  计算子串长度

    语法     expr match $string substr

    说明     必须从头开始匹配,如果匹配的是字符串中间的字符则匹配不到

    举例

      [root@VM_0_13_centos ~]# var="quickstart is app"
      [root@VM_0_13_centos ~]# sub_len=$(expr match "$var" app)
      [root@VM_0_13_centos ~]# echo $sub_len
      0
      [root@VM_0_13_centos ~]# sub_len=$(expr match "$var" quick)
      [root@VM_0_13_centos ~]# echo $sub_len
      5
      [root@VM_0_13_centos ~]# sub_len=$(expr match "$var" quick.*)
      [root@VM_0_13_centos ~]# echo $sub_len
      17

  截取子串  

  语法 说明
方法一 ${string:positon} 从string中的position位置开始截取到字符串结尾
方法二 ${string:position:length} 从position开始,匹配长度为length的子串
方法三 ${string: -position} 从右边开始匹配,注意:和-之间必须有空格
方法四 ${string:(position)} 根据position的正负决定从哪边开始匹配
方法五 expr substr $string $position $length 从position开始,匹配长度为length的子串
说明:使用${string:position}索引计数是从0开始的,使用expr索引计数是从1开始的

    举例

[root@VM_0_13_centos ~]# var="kafka hadoop yarn mapreduce"  [root@VM_0_13_centos ~]# substr=${var:10}

[root@VM_0_13_centos ~]# echo $substr

op yarn mapreduce

[root@VM_0_13_centos ~]# substr=${var:10:5}

[root@VM_0_13_centos ~]# echo $substr     

op ya

[root@VM_0_13_centos ~]# substr=${var: -5}

[root@VM_0_13_centos ~]# echo $substr    

educe

[root@VM_0_13_centos ~]# substr=${var:(-5)}

[root@VM_0_13_centos ~]# echo $substr     

educe

[root@VM_0_13_centos ~]# substr=${var:(5)}

[root@VM_0_13_centos ~]# echo $substr    

hadoop yarn mapreduce

[root@VM_0_13_centos ~]# substr=${var:(-5):2}

[root@VM_0_13_centos ~]# echo $substr       

ed

[root@VM_0_13_centos ~]# substr=$(expr substr "$var" 10 5)

[root@VM_0_13_centos ~]# echo $substr                    

oop y

3.命令替换

  语法格式
方法一 `command`
方法二 $(command)

备注:$(())主要用来进行整数运算,包括加减乘除,注意与$()的区别

 

# 获取系统的所有用户并输出

#!/bin/bash

for user in $(cat /etc/passwd|cut -d ":" -f 1)

do

        echo $user

done

# num1=50

# num2=70

# echo “$(($num1+$num2))”

120

 

# 判断nginx是否存活,不存活拉起nginx进程

#!/bin/bash

nginx_process_num=$(ps -ef|grep nginx|grep -v grep|wc -l)

 

if [ $nginx_process_num -eq 0 ];then

        systemctl start nginx

 

4.有类型变量

  declare命令和typeset命令两者等价

  declare、typeset命令都是用来定义变量类型的

参数

含义

-r

将变量声明为只读

-i

将变量声明为整数

-a

将变量声明为数组

-f

显示此脚本前定义过的所有函数及内容

-F

仅显示此脚本前定义过的函数名

-x

将变量声明为环境变量(全局变量)

+r +i +a +x

取消变量的声明

# declare -i

[root@VM_0_13_centos ~]# num1=10

[root@VM_0_13_centos ~]# num2=$num1+10

[root@VM_0_13_centos ~]# echo $num2

10+10

[root@VM_0_13_centos ~]# expr $num1+10

10+10

[root@VM_0_13_centos ~]# expr $num1 + 10

20

[root@VM_0_13_centos ~]# declare -i num3

[root@VM_0_13_centos ~]# num3=$num1+90

[root@VM_0_13_centos ~]# echo $num3

100

 

# declare -f

[root@VM_0_13_centos ~]# declare -f | more

__expand_tilde_by_ref ()

{

    if [[ ${!1} == \~* ]]; then

        if [[ ${!1} == */* ]]; then

            eval $1="${!1/%\/*}"/'${!1#*/}';

        else

            eval $1="${!1}";

        fi;

    fi

}

 

# declare -x

[root@VM_0_13_centos ~]# num=30

[root@VM_0_13_centos ~]# echo $num

30

[root@VM_0_13_centos ~]# vim test2.sh

#!/bin/bash

echo $num

[root@VM_0_13_centos ~]# sh test2.sh

 

[root@VM_0_13_centos ~]# declare -x num

[root@VM_0_13_centos ~]# sh test2.sh  

30

5.数组变量

# declare -a
[root@VM_0_13_centos ~]# declare -a array
[root@VM_0_13_centos ~]# array=("jones" "mike" "kobe" "jordan")
# 输出数组内容
[root@VM_0_13_centos ~]# echo ${array[@]} # 输出数组中全部元素
jones mike kobe jordan
[root@VM_0_13_centos ~]# echo ${array[0]}
jones
[root@VM_0_13_centos ~]# echo ${array[1]}
mike
# 获取数组长度
[root@VM_0_13_centos ~]# echo ${#array} # 获取数组内元素个数
5
[root@VM_0_13_centos ~]# echo ${#array[0]} # 获取数组内索引为0的元素长度
5
# 数组元素赋值
[root@VM_0_13_centos ~]# array[0]="lily"
[root@VM_0_13_centos ~]# echo ${array[0]} # 给数组下标索引为1的元素赋值为lily
lily
[root@VM_0_13_centos ~]# array[20]="hanmeimei" # 在数组尾部添加一个新元素
[root@VM_0_13_centos ~]# echo ${array[@]}
lily mike kobe jordan hanmeimei
# 删除元素
[root@VM_0_13_centos ~]# unset array[0] # 删除数组中的元素
[root@VM_0_13_centos ~]# echo ${array[@]}
mike kobe jordan hanmeimei
[root@VM_0_13_centos ~]# unset array # 清空数组
[root@VM_0_13_centos ~]# echo ${array[@]}

# 分片访问
[root@VM_0_13_centos ~]# echo ${array[@]:1:3} # 获取数组中索引从1开始到3的元素
mike kobe Jordan
# 内容替换
[root@VM_0_13_centos ~]# echo ${array[@]/ob/OB} # 将数组中所有元素包含ob的字符串替换为OB,元素组内容不变
jones mike kOBe Jordan
# 遍历数组
[root@VM_0_13_centos ~]# for v in ${array[@]};do echo $v ;done
jones
mike
kobe
Jordan

 6.bash数学运算

  

bash数学运算之expr(仅支持整数运算)

 

语法

方法一

expr $num1 operator $num2

方法二

$(($num1 operator $num2))

 

expr比较操作符

操作符

含义

num1 \| num2

num1不为空且非0,返回num1;否则返回num2

num1 \& num2

num1不为空且非0,返回num1;否则返回0

num1 \< num2

num1小于num2,返回1;否则返回0

num1 \<= num2

num1小于等于num2,返回1;否则返回0

num1 = num2

num1等于num2,返回1;否则返回0

num1 != num2

num1不等于num2,返回1;否则返回0

num1 \> num2

num1大于num2,返回1;否则返回0

num1 \>= num2

num1大于等于num2,返回1;否则返回0

[root@VM_0_13_centos ~]# num1=100

[root@VM_0_13_centos ~]# num2=50

[root@VM_0_13_centos ~]# expr $num1 \> $num2 # >在shell中是保留关键字,是数据流重定向的作用,所以想要使用这个符号,需要转义

1

[root@VM_0_13_centos ~]# expr $num1 \< $num2

0

 

expr算数运算操作符

操作符

含义

num1 + num2

求和

num1 – num2

求差

num1 \* num2

求积

num1 / num2

求商

num1 % num2

求余

[root@VM_0_13_centos ~]# num3=$(expr $num1 + $num2)

[root@VM_0_13_centos ~]# echo $num3

150

[root@VM_0_13_centos ~]# num3=$(($num1 + $num2))   

[root@VM_0_13_centos ~]# echo $num3            

150

 

[root@VM_0_13_centos ~]# num=10.11    

[root@VM_0_13_centos ~]# expr $num + 1

expr: non-integer argument

[root@VM_0_13_centos ~]# echo $?

2

[root@VM_0_13_centos ~]# num=10

[root@VM_0_13_centos ~]# expr $num + 1

11

[root@VM_0_13_centos ~]# echo $?     

0

 

      bash数学运算之bc(支持浮点数运算,可以通过设置scale设置浮点数的精度)

num1 + num2

求和

num1 – num2

求差

num1 \* num2

求积

num1 / num2

求商

num1 % num2

求余

num1 \^ num2

指数运算

[root@VM_0_13_centos ~]# bc

1/20

0

scale=2

1/20

.05

 

# 非交互式操作

[root@VM_0_13_centos ~]# echo "23.3+24"|bc

47.3

[root@VM_0_13_centos ~]# echo "scale=4;23.3/24"|bc

.9708

 

posted @ 2019-03-09 15:12  小宇子2B  阅读(112)  评论(0)    收藏  举报