1. 首先是变量命名规范,和大多数语言差不多
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线
_
- 不能使用标点符号。
- 不能使用bash里的关键字,可用help命令查看保留关键字
2. 定义一个变量
myname="Pning"
运行效果如下
3. 输出定义过的变量
echo ${myname}
或者
echo $myname
运行效果如下
4. 将一个变量设置问只读变量
demo_1.sh
#!/bin/bash
myname="Pning"
readonly myname
myname="pning"
echo ${myname}
对照组
demo_2.sh
#!/bin/bash
myname="Pning"
myname="pning"
echo ${myname}
运行效果
5. 删除变量
demo_1.sh
#!/bin/bash
myname="Pning"
unset myname
echo ${myname}
对照组
demo_2.sh
#!/bin/bash
myname="Pning"
echo ${myname}
运行效果
6. 变量类型
运行shell时,会同时存在三种变量:
(1.) 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
(2.) 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量
(3.) shell变量: shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
7.字符串
shell的字符串有两种模式:'单引号字符串'
和"双引号字符串"
- 单引号字符串
(1. )单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
(2. )单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用 - 双引号字符串
(1.)双引号里可以有变量
(2.)双引号里可以出现转义字符
demo.sh
#!/bin/bash
name="Pning"
str1='My name is \n ${name}'
str2="My name is \n ${name}"
echo -e ${str1}
echo "----------------"
echo -e ${str2}
默认情况下,echo关闭了对转义字符的解释
-e
参数可打开echo对转义字符的解释功能。
-E
关闭转义字符,是默认值
运行结果
- 字符串的拼接
#!/bin/bash
name="Pning"
str1='My name is '${name}
str2='My name is ${name}'
echo ${str1} ${str2}
echo "------------------"
str3="My name is ${name}"
str4="My name is "${name}
echo ${str3} ${str4}
运行结果
- 获取字符串长度
str="Pning"
echo ${#string}
运行结果
- 查找子字符串
str="My name is Pning"
echo `expr index "${str}" "in"`
查询在str
变量中第一个出现的i
字符或者第一个出现的’n’字符的位置
注意的是,echo后面 ` 是反引号,而不是单引号 ‘’
运行结果
- 提取子字符串
str="My name is Pning"
echo ${str:1:4}
字符串第 2 个字符开始截取 4 个字符
运行效果
数组
- 数组的定义
(1.)整体定义
myname_1=(P N I N G)
这个类似于java的char[] = {'P','N','I','N','G'}
(2.)一个个赋值
myname_2[0]=p
myname_2[1]=n
myname_2[2]=i
myname_2[3]=n
myname_2[4]=g
运行效果
2. 读取数组数据
(1.)读取所有元素
echo ${myname_1[@]}
echo ${myname_2[*]}
运行效果
(2.)通过索引获取元素
echo ${myname_1[0]}
echo ${myname_2[0]}
运行效果
- 获取数组的长度
(1.)获取数组元素个数
echo ${#myname_1[@]}
# 或者
echo ${#myname_1[*]}
(2.)获取数组某个元素的长度
echo ${#myname_1[1]}
运行效果
注释
shell的注释也是有两种,当行注释和多行注释
- 当行注释
#
和大众语言的//
具有一样的效果,但注意的是,这个符号只有在这一行的开头时才会起作用 - 多行注释
格式位已:<<符号
开头,以符号
结尾,例如下面示例
:<<EOF
注释内容
EOF
:<<'
注释内容
'
:<<!
注释内容
!