shell数据类型
Shell是一门弱类型的语言,所以定义变量时不需要设定变量的数据类型,Shell会根据上下文去确定具体的类型,在执行时会进行语法检查。
下面是一个使用错误数据类型做计算的例子:
num="devfz"
echo `expr $num + 1` //会提示错误: expr: not a decimal number: 'devfz'
num=1
echo `expr $num + 1` //结果:2
可见shell在执行过程仍是会区分数据类型的,shell常用的数据类型有:字符串、数字和数组。
字符串
字符串是由单引号或双引号包围的一串字符。当然也支持不带引号的定义但不推荐这样做,如果字符中间存在空格可能会被认为是多个变量。在shell中所有变量默认都是字符串型
单引号定义
str='this is a string'
单引号字符串的特点:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号定义
name="devfz"
str="I know you are \"$name\"
echo -e $str
输出结果为:
I know you are "devfz"
双引号字符串的特点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
无引号定义字符串示例:
bdog=blackdog
echo ${bdog} # 输出:blackdog
wdog=white dog #报错:dog: 未找到命令
echo ${wdog}
字符串操作
- 拼接字符串
name="devfz"
# 使用双引号拼接
greeting="hello, "$name" !"
greeting1="hello, ${name} !"
echo $greeting $greeting1
# 使用单引号拼接
greeting2='hello, '$name' !'
greeting3='hello, ${name} !'
echo $greeting2 $greeting3
输出结果为:
hello, devfz ! hello, devfz !
hello, devfz ! hello, ${name} !
- 获取字符串长度
string="abcd"
echo ${#string} # 输出 4
变量为数组时,${#string} 等价于 ${#string[0]}
使用expr命令实现:
expr length 字符串
- 截取子字符串
以下实例从字符串截取第2-4个字符:
str="Hello world!"
echo ${str:1:4} # 输出 ello
注:位置索引从0开始
使用expr命令实现截取:
expr substr 字符串 偏移量 长度.
注: 偏移量从1开始
- 查找子字符串
命令格式:expr index 字符串 要查找的字符, 返回要查找的字符在被搜索字符串中首次出现的位置索引,从1开始,没找到返回0
string="hello world !"
echo `expr index "$string" lo` # 输出 3
注: ` 是反引号,而不是单引号 '
数字
数字主要分为整数(int)和浮点数(float), 默认算术运行符(加减乘除取余)是只支持整数运算的
有4种方式可实现整数算术运算: expr命令, $(()), $[], let命令. 示例:
[oper@test96 ~]$ expr 1 + 1
2
[oper@test96 ~]$ echo $((2+3))
5
[oper@test96 ~]$ echo $[2+3]
5
[oper@test96 ~]$ let c=1+2
[oper@test96 ~]$ echo $c
3
详情请参考运算符一节
数组和字典
转Shell 数组和字典一节