数组
数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合
§数组名和索引
索引:编号从0开始,属于数值索引
注意:所以可支持使用自定义的格式,而不仅是数值格式,即关联索引,bash4.0版本之后开始支持,bash的数组支持稀疏格式(索引不连续)
§声明数组
declare –a arryname
declare –A arryname 关联数组
初始化或赋值:各元素之间使用空白字符隔开,不加下标默认为第一个
第一种方式
arryname=(‘a’ ‘b’ ‘c’)
arryname=( [0]=’a’ [1]=’b’ [2]=’c’)
第二种方式
arryname[1]=”one”
第三种方式:交互式
read -a arryname
a b c
§ 引用数组
echo ${arryname[0]}
§获取元素的长度
echo ${#arryname[@]}
echo ${#arryname[*]}
当我们想去某个字符的长度,挠破脑袋想找个工具来计算出字符串的长度时,bash shell提供了计算出字符的长度,这时候bash shell的功能就展露无遗了
bash的伪随机生成器
$RANDOM
取特定位数的
$[$RANDOM%11]:取10以内的随机数
§数组数据处理
引用数组中的元素:
所有元素:echo ${arryname[@] , echo ${arryname[*]}
数组切片:${arryname[@]:offset:number}
offset:要跳过的元素个数
number:要去除的元素个数
echo ${arryname[@]:2:3} 跳过两个字符,取三个字符
向数组中追加元素
arryname[${#arryname[@]}]
删除数组中的某元素:导致稀疏格式
unset arryname[索引编号]
关联数组:
dexclare –A arryname3
arryname=([a]=1 [b]=2 [c]=3 … ),这里的索引编号可以自定义
注意:在赋值之前,必须要声明数组为关联数组
§字符串处理
bash的字符串处理工具
字符串切片
echo ${#arryname}:返回字符串变量的arryname的长度
echo ${arryname:offset}:返回字符串变量arryname从第offset个字符后(不包括offset的取值在0到${#arryname}-1之间
echo ${arryname:offset:number}:返回字符串变量arryname中从offset个字符后(不包括)的字符开始,长度为number的字符
echo ${arryname: -number}:去字符串最右侧的几个字符
注意:冒号后必须有一个空白字符
基于模式取子串
echo ${arryname#*keyword}:其中keywod可以是指定的任意字符
功能:自左而右,查找arryname变量所存储的字符串中,第一次出现keyword,删除字符串开头至第一次出现keyword字符之间的所有字符
echo ${arryname##*keyword}
功能:自左而右,查找arryname变量所存储的字符串中,删除字符串开头至最后一次出现keyword字符之间的所有字符
echo ${arryname%keyword*}:其中keyword可以使指定的任意字符
功能:自由而左,查找arryname变量所存储的字符串中,第一次出现keyword,删除字符串最后一个字符至第一次出现keyword字符之间的所有字符
echo ${arryname%%keyword*}
功能:自由而左,查找arryname变量所存储的字符串中,删除字符串最后一个字符至最后一次出现keyword字符之间的所有字符
在工作中,有时可能会遇到去一个url的协议以及端口这时候取字符串这个功能就非常好使了
url=http://www.magedu.com:80
${url##*:}80
${url%%:*}http
查找替换
echo ${arryname/pattern/abc:查找arryname所表示的字符串中,第一次被pattern所匹配到的字符串,用abc来替换
echo ${arryname//pattern/abc} :查找arryname所表示的字符串中,所有被pattern所匹配到的字符串,用abc来替换
echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,行首被pattern所匹配到的字符串,用abc来替换
echo ${arryname/%pattern/abc}:查找arryname所表示的字符串中,行尾被pattern所匹配到的字符串,用abc来替换
查找并删除
echo ${arryname/pattern}:查找arryname所有字符串中,删除第一次被pattern所匹配到的字符串
echo ${arryname//pattern}:查找arryname所有字符串中,删除所有被pattern所匹配到的字符串
echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,删除行首被pattern所匹配到的字符串echo
${arryname/%pattern/abc}:查找arryname所表示的字符串中,删除行尾被pattern所匹配到的字符串
字符大小写转换
echo ${arryname^^}:把arryname的所有小写字母转换成大写
echo ${arryname,,}:把arryname的所有大写字母转换成小写
变量赋值
echo ${arryname:-value}:如果arryname为空或者未设置,那么就返回value,否则,则返回arryname的值
echo ${arryname:+value}:如果arryname非空,那么就返回value,否则返回空值
echo ${arryname:=value}:如果arryname为空或者未设置,那么就返回value,并且将value赋值给arryname,否则返回arryname的值
echo ${arryname:?error_messages}:如果arryname的值为空或未被设置,那么返回error_messages;否则,则返回arryname的值
为脚本程序使用配置文件,实现变量赋值
定义在文本文件中,每行定义”name=value”
在脚本中source次文件即可
Shell变量一般是无类型的,但是Bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的
declare [选项] 变量名
-r 将变量设置为只读属性
-I 将变量设置为整型
-a 将变量设置为数组
-A 将变量设置为关联数组
-f 显示此脚本前定义过的所有函数名及内容
-F 仅显示此脚本前定义过的所有函数名
-x 将变量定义为环境变量
-l 将变量值转为小写字母
-u 将变量值转为大写字母
间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就成为间接引用
a=b
b=123
a的值b,而b又是变量名
b的值为123,间接变量引用是指通过a获得变量值123的行为
Bash Shell提供了两种格式实现间接变量引用
eval c=\\$$a
c=${!a}
Bash如何展开命令行
把命令行分成单个命令词
展开别名
展开大括号中的声明
展开波浪符声明(~)
命令替换$()和` `
再次把命令行分成命令词
展开文件通配符(*、?、[ab])
准备I/O重定向(<、>)
运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释
echo you cost :\$500
加引号来防止扩展
单引号’ ‘ 防止所有扩展
双引号也防止所有扩展,但是一下几种情况除外
$ 变量扩展
` 命令替换
\ 禁止单个字符扩展
! 历史命令替换
Bash的配置文件
按生效范围划分
全局配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置
~/.bash_profile
~/.bashrc
按功能划分
profile类:为交互式登录的shell提供配置
全局:/etc/profile,/etc/profile.d/*.sh
个人:~/.bash_profile
功能
用于定义环境变量
运行命令或脚本
bashrc类:为非交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功能
定义命令别名
定义本地变量
修改profile和bashrc文件后需生效
两种方法:
重新启动shell进程
“.” 或source 文件
shell登录的两种方式
交互式登录:
(1)直接通过终端输入账号密码登录;
(2)使用“su-UserName”切换的用户
执行顺序:
/etc/profile-à/etc/profile.d/*.shà~/.bash_profileà~/.bashrcà/etc/bashrc
非交互式登录:
(1)suUserName
(2)图形界面下打开的终端
(3)执行脚本
执行顺序:
~/.bashrcà/etc/bashrcà/etc/profile.d/*.sh
Bash退出任务
保存在~/.bash_logout文件中
在退出登录shell时运行
用于创建自动备份和清除临时文件
1、生成10个随机数,采用冒泡算法进行升序或降序排序
将给出的数,一次做大小比较,从小往大的顺序排列
#!/bin/sh
#sorting following array
echo "please input a number list:"
read -a arr
for (( i=0 ; i<${#arr[@]} ; i++ ))
do
for (( j=${#arr[@]} - 1 ; j>i ; j-- ))
do
#echo $j
if [[ ${arr[j]} -lt ${arr[j-1]} ]]
then
t=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=$t
fi
done
done
echo "after sorting:"
echo ${arr[@]}