一。
- 数组
- 数组简介
-
变量:用一个固定的字符串,代替一个不固定字符串。
数组:用一个固定的字符串,代替多个不固定字符串。
- 类型
-
普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
图示如下:
总结:变量切片有个索引的概念。一个索引(整数)对应一个字符。
普通数组:中的索引对应一个字符串。
关联数组:数组中的索引可以使用字符串。
1.普通数组
赋值方法一:一个赋一个值
格式:数组名[下标]=变量值
#array[0]=pear
#array[1]=apple
#array[2]=orange
#array[3]=peach
赋值方法二:一次赋多个值
#array=(tom jack alice)
#array=(`cat /etc/passwd`) //将该文件中每一行作为一个元素赋值给数组array
#array=(`ls /var/ftp/shell/for*`) //将目录下的各文件作为元素输出给数组
#array=(tom jack alice “bash shell”)
#red=红色
blue=蓝色
green=绿色
colors=($red $blue $green)
查看数组:
#declare -a | grep array
echo
#查看所有元素 echo ${array[@]} 等于echo ${array[*]}
访问数组元素:
#访问数组中第一个元素 echo ${array[0]}
#统计数组中元素的个数 echo ${#array[*]}
#获取数组元素的索引 echo ${!array[*]}
#从数组下标1开始 echo ${array[*]:1}
#从数组下标1开始,访问两个数据 echo ${array[@]1:2}
- 关联数组(先声明)
-
赋值方法一: 一次赋一个值:数组名[索引]=变量值
#declare -A ass
#ass[index1]=pear
#ass[index2]=apple
#ass[index3]=orange
查看#echo ${ass[@]}
# declare -A | grep ‘ass’
赋值方法二:一次赋多个值
#declare -A bss
#bss=([index1]=tom [index2]=jack [index3]=alice )
访问数组元素
#echo ${bss[index1]} 访问数组中的第二个数组
#echo ${bss[@]} = echo ${bss[*]} 访问数组中所有元素
#获得数组中元数的个数 echo ${#bss[*]}
#获得数组元数的索引 echo ${!bss[*]}
While 语句按行分割
For语句按空格分割
示例如下
#vim while.sh
#!/usr/bin/bash
while read line
do
host[i++]=$line
done < /etc/hosts
for i in ${!host[*]}
do
echo “索引是$i :值是${host[$i]}”
done
#vim for.sh
OLD_IFS=$IFS
IFS=$’\n’
for line in `cat /etc/hosts`
do
host[i++]=$line
done
for i in ${!host[@]}
do
echo “索引$i,他的值是${host[$i]}”
done
IFS=OLD_IFS
for按空格分割,补上以上三条命令后按while的回车分割,按行输出
for原本的按空格分割
加上条件以后按回车分割
定义性别的文件
#Vim sex.txt
Jack m henan
Alice f Hebei
Tom m Beijing
#vim sex.sh
declare -A sex
while read line
do
type=`echo $line | awk ‘{print $2}’`
let sex[$type]++
done < sex.txt
for i in ${!sex[*]}
do
echo “索引值是$i,值是${sex[$i]}”
done
使用数组统计用户shell的类型和数量
#vim shell.sh
#!/usr/bin/bash
declare -A shells
while read aa
do
type=`echo $aa |awk -F: ‘{print $NF}’`
let shells[$type]++
done < /etc/passwd
for i in ${! shells[*]}
do
echo “索引是$i;索引值是${shells[$i]}”
done
- 函数
-
概念:函数是一段完成特定功能的代码片段(块),在shell中定义了函数,就可以使用代码模块化,便于复用代码(注意函数必须先定义后使用)
定义函数:
方法一:函数名(){
函数要实现的功能代码
}
方法二: function 函数名 {
函数要实现的功能代码
}
传参:让函数能够自定义
Vim bb.sh
#!/usr/bin/bash
fun() {
factorial=1
for((i=1;i<=$1;i++))
do
factorial=$[$factorial*$i]
done
echo “$i的阶乘是$factorial”
}
fun $1
fun $2
fun $3
#bash bb.sh 3 5 6
3的阶乘是6
5的阶乘是120
6的阶乘是720
Shell的写法和其他运算表达式
Vim cc.sh
#!/bin/bash
func () {
factorial=1
#for((i=1;i<=$1;i++))
for I in `seq $1`
do
#factorial=$[$factorial*$i]
#let factorial=$factorial*$i
let factorial*=$i
done
echo “$1的阶乘是:$factorial”
}
fun $1
#bash cc.sh 3
函数传参,数组传参
Vim 22.sh
#!/bin/bash
#先定义一个数组
num=(1 2 3)
#定义一个函数
array() {
factorial=1
for i in $*
do
factorial=$[ $factorial * $i ]
done
echo $factorial
}
#调用函数,使用数组
array ${num[*]}
函数结果,赋予数组(用户获赠流量包,每人增加5g流量)
Vim 33.sh
#!/bin/bash
num=(1 2 3 )
array() {
#定义变量仅在函数中有效
local j
#设置循环的次数,等于索引的总数
for i in $*
do
#定义不同的值加5,注意取值的时候使用的是索引
outrray[j++]=$[$i+5]
done
#输出新的数组
echo “${outarray[*]}”
}
调出函数使用数组
array${num[*]}
通过循环脚本,输出如下结果
b 1 2 3 4 5 6 7 8 9
c 1 2 3 4 5 6 7 8 9
d 1 2 3 4 5 6 7 8 9
编写循环脚本
#!/bin/bash
do
echo $i
for j in {1..9}
do
echo $j
done
done
输出为:a
1
2
.
.
注:echo默认输出换行符,使用-n则不会输出换行符
解决换行问题
#!/bin/bash
for i in {a..d}
do
echo $i
for j in {1..9}
do
echo -n $j
done
done
输出为:a 1 2 3 4 5 6……b 1 2……c 1 2 3 ……d 1 2 3… 9
正确的输出表达式
#!/bin/bash
for i in {a..d}
do
echo $i
for j in {1..9}
do
echo -n $j
done
echo //输出回车换行
done
输出则为:
b 1 2 3 4 5 6 7 8 9
c 1 2 3 4 5 6 7 8 9
d 1 2 3 4 5 6 7 8 9
- continue 跳出本次循环
-
for i in {a..d}
do
echo $i
for j in {1..9}
do
if [ $j -eq 5 ]
then
continue
fi
echo -n $j
done
echo //输出回车换行
done
是5则跳出本层循环
输出为:
a 1 2 3 4 6 7 8 9
b 1 2 3 4 6 7 8 9
c 1 2 3 4 6 7 8 9
d 1 2 3 4 6 7 8 9
- exit 直接退出
-
for i in {a..d}
do
echo $i
for j in {1..9}
do
if [ $j -eq 5 ]
then
exit
fi
echo -n $j
done
echo //输出回车换行
done
直接退出本次循环
输出为:a 1 2 3 4
- break 跳出本层循环
-
#!/bin/bash
for i in {a..d}
do
echo $i
for j in {1..9}
do
if [ $j -eq 5 ]
then
break
fi
echo -n $j
done
echo //输出回车换行
done
注:break 加数字是跳出循环的层数
break 不加数字默认是1,跳出本层循环
输出是:
a 1 2 3 4
b 1 2 3 4
c 1 2 3 4
d 1 2 3 4
break2 输出为a 1 2 3 4
for循环不定义循环的范围,循环取参数作为循环的范围
#!/usr/bin/bash
for i
do
let sum+=$i
done
echo “sum :$sum”
#bash sum.sh 1
输出为 1
#bash sum.sh 1 4
输出为 5
While循环发现停不下来,shift可以进行解决此问题
do
let sum+=$1
echo $sum
done
echo “sum :$sum”
测试:bash sum.sh 1 发现根本停不下来
While [ $# -ne 0 ]
do
let sum+=$1
shift
echo $sum
done
echo “sum :$sum”
测试:bash sum.sh 1 2 输出为3
bash sum.sh 4 5 6 输出为15
总结:shift默认是1 (左移一位)
shift 2 (左移两位)
bash sum.sh 1 2 3 4 5 6 输出为9
九九乘法表
程序
输出:
-