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}

字符串操作

  1. 拼接字符串
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} !
  1. 获取字符串长度
string="abcd"  
echo ${#string}   # 输出 4  

变量为数组时,${#string} 等价于 ${#string[0]}

使用expr命令实现:

expr length 字符串
  1. 截取子字符串

以下实例从字符串截取第2-4个字符:

str="Hello world!"  

echo ${str:1:4} # 输出 ello  

注:位置索引从0开始

使用expr命令实现截取:

expr substr 字符串 偏移量 长度. 

注: 偏移量从1开始

  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 数组和字典一节