变量值的定义
- 数值的定义
必须连续的数字
num=1997
- 字符串的定义
字符串须加引号,双引号解析变量,单引号不解析变量
name="1997sty"
- 命令的定义
反引号解析命令,注意命令的定义是把结果复制给了变量如果想改变结果再次赋值
time=`date`
time=$(date)
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
最后一次更新于2020-02-03 14:39
0 条评论