变量值的定义

  • 数值的定义

必须连续的数字

num=1997
  • 字符串的定义

字符串须加引号,双引号解析变量,单引号不解析变量

name="1997sty"
  • 命令的定义

反引号解析命令,注意命令的定义是把结果复制给了变量如果想改变结果再次赋值

time=`date`
time=$(date)

1.png

Shell特殊变量

  • $0 : 获取运行脚本的路径
#!/bin/bash
echo $0

运行结果

[root@home ~]# ./test.sh
./test.sh
[root@home ~]# sh test.sh
test.sh
[root@home ~]# sh /root/test.sh
/root/test.sh
[root@home ~]# /root/test.sh
/root/test.sh

如果只需要获取脚本名可以使用basename

[root@home ~]# basename test.sh
test.sh
[root@home ~]# basename /root/test.sh
test.sh
  • $n : 获取脚本的第n个参数,例如$1,$2,${10},$9后面的参数需要加{}
  • $# : 获取脚本传参的总个数
  • $* : 获取脚本所有的参数,加上双引号则把参数视为一个参数
  • $@ : 获取脚本所有的参数,加上双引号则吧参数是为独立的参数

$*$@运行结果

[root@home ~]# set -- "long long ago" I was born 
[root@home ~]# echo $*
long long ago I was born
[root@home ~]# echo $@
long long ago I was born
[root@home ~]# echo "$*"
long long ago I was born
[root@home ~]# echo "$@"
long long ago I was born
[root@home ~]# for i in $* ;do echo $i;done
long
long
ago
I
was
born
[root@home ~]# for i in $@;do echo $i;done
long
long
ago
I
was
born
[root@home ~]# for i in "$*";do echo $i;done
long long ago I was born
[root@home ~]# for i in "$@";do echo $i;done
long long ago
I
was
born
  • $? : 获取上一条命令的返回结果0为成功非0失败
#可以通过控制返回值来获得不同的结果
#!/bin/bash
exit 50

#使用命令输出$? 值范围为0-255
[root@home ~]# echo $?
50
  • $$ :获取当前脚本的PID
  • $! : 获取上一个在后台运行脚本的PID,一般在调试使用,可以通过该PID杀死上一个运行的脚本
  • $_ : 获取命令行最后一个参数相当于ESC + .

脚本传参的三种方式

  • 直接传参
echo $1 $2
  • 赋值传参
name=$1
age=$2
echo $name $age
  • read传参
read -p "please input name:" name
echo $name

环境变量字串

字串切片和长度统计

[root@home ~]# test="long long ago I was born"
[root@home ~]# echo $test
long long ago I was born
[root@home ~]# echo ${test:0:2}
lo
[root@home ~]# echo ${test:0:10}
long long
[root@home ~]# echo ${test:0:11}
long long a

统计字符串长度

[root@home ~]# echo ${#test}
24
[root@home ~]# echo $test|wc -L
24
[root@home ~]# expr length "$test"
24
[root@home ~]# echo $test|awk '{print length}'
24

统计以下字符串输出小于4的字符

#!/bin/sh

for i in long long ago I was born
do
    [ ${#i} -lt 4 ] && echo $i
done

使用awk

#awk列方式
echo "long long ago I was born"| xargs -n1|awk '{if(length<4) print}'
#横向判断
echo "long long ago I was born"| awk '{for(i=1;i<=NF;i++)if (length($i)<4)print $i}'

字串的删除和替换

  • #从左往右匹配删除,##贪婪匹配
[root@home ~]# url="blog.1997sty.com"
[root@home ~]# echo $url
blog.1997sty.com
[root@home ~]# echo ${url#*.}
1997sty.com
[root@home ~]# echo ${url#*.*.}
com
[root@home ~]# echo ${url##*.}
com
  • %从右往左匹配删除,%%贪婪匹配
[root@home ~]# url="blog.1997sty.com"
[root@home ~]# echo $url
blog.1997sty.com
[root@home ~]# echo ${url%.*}
blog.1997sty
[root@home ~]# echo ${url%.*.*}
blog
[root@home ~]# echo ${url%%.*}
blog
  • /替换一个字符,//替换所有字符
[root@home ~]# url="blog.1997sty.com"
[root@home ~]# echo $url
blog.1997sty.com
[root@home ~]# echo ${url/9/0}
blog.1097sty.com
[root@home ~]# echo ${url//9/0}
blog.1007sty.com

数值运算

  • expr整数运算

使用*运算乘法时,老版本的系统可能会出现expr: syntax error报错,需要转义

[root@home ~]# expr 1 + 1
2
[root@home ~]# expr 1- 1
0
[root@home ~]# expr 1* 1
expr: syntax error
[root@home ~]# expr 1 \* 1
1
[root@home ~]# expr 1 / 1
1
  • $(())整数运算
[root@home ~]# echo $((10+10))
20
[root@home ~]# echo $((10-10))
0
[root@home ~]# echo $((10*10))
100
[root@home ~]# echo $((10/10))
1
  • $[]整数运算
[root@home ~]# echo $[10+10]
20
[root@home ~]# echo $[10-10]
0
[root@home ~]# echo $[10*10]
100
[root@home ~]# echo $[10/10]
1
  • bc整数小数运算
[root@home ~]# echo 10+10.5|bc
20.5
[root@home ~]# echo 10-10.5|bc
-.5
[root@home ~]# echo 10*10.5|bc
105.0
[root@home ~]# echo 10/10.5|bc
0
  • awk整数小数运算
[root@home ~]# awk 'BEGIN{print 1+1}'
2
[root@home ~]# awk 'BEGIN{print 1-1}'
0
[root@home ~]# awk 'BEGIN{print 1*1}'
1
[root@home ~]# awk 'BEGIN{print 1/1}'
1
  • python整数小数运算
[root@home ~]# python
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> 1-1
0
>>> 1*1
1
>>> 1/1
1

expr,$(()),$[]只能计算整数,所以可以利用这个特性配合$?来判断输入的数,是否为整数

[root@home ~]# expr 1 + 0.5 >/dev/null 2>&1
[root@home ~]# echo $?
2
[root@home ~]# expr 1 + 0 >/dev/null 2>&1
[root@home ~]# echo $?
0