-
变量的替换
(1)使用一个#变量
(2)使用两个#变量
(3)使用一个%变量
(4)使用两个%变量
(5)使用一个/替换
(6)使用两个/替换
-
字符串处理
(1)计算字符串长度
方法一:${#string}
方法二:expr length $string
(2)获取字符索引位置。将substr拆分为一个一个字符,从$string中查找满足字符的$string的第一个字符的位置。
expr index “$string” substr
(3)获取子串长度。从$string的头开始匹配,只要substr不在开头就匹配不到
expr match "$string" substr
(4)抽取字符串中的子串
方法一:索引从0开始
(1)、${string:position}
(2)、${string:position:length}
(3)、${string: -position} 或者 ${string:(position)},注意第一个-前面有一个空格
方法二:索引从1开始
expr substr $string $position $length
以上知识点脚本实战
需求描述:
变量string=“Bigdata process framework is Hadoop,Hadoop is an open source project”,执行脚本后,打印输出string字符串变量,并给出用户以下选项:
(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Mapreduce
(4)、替换全部Hadoop为Mapreduce
用户输入数字1|2|3|4,可以执行对应项的功能:输入q|Q则退出交互模式。
思路分析:
1.将不同的功能模块划分,并编写函数
function print_tips
function len_of_string
function del_hadoop
function rep_hadoop_mapreduce_first
function rep_hadoop_mapreduce_all
2.实现第一步所定义的功能函数
#!/bin/bash
string="Bigdata process framework is Hadoop,Hadoop is an open source project"
function print_tips
{
echo "********************************"
echo "(1)打印string长度"
echo "(2)删除字符串中所有的Hadoop"
echo "(3)替换第一个Hadoop为Mapreduce"
echo "(4)替换全部Hadoop为Mapreduce"
}
function len_of_string
{
echo "${#string}"
}
function del_hadoop
{
echo "${string//Hadoop/}"
}
function rep_hadoop_mapreduce_first
{
echo "${string/Hadoop/Mapreduce}"
}
function rep_hadoop_mapreduce_all
{
echo "${string//Hadoop/Mapreduce}"
}
3.程序主流程的设计
完整脚本
#!/bin/bash
string="Bigdata process framework is Hadoop,Hadoop is an open source project"
function print_tips
{
echo "********************************"
echo "(1)打印string长度"
echo "(2)删除字符串中所有的Hadoop"
echo "(3)替换第一个Hadoop为Mapreduce"
echo "(4)替换全部Hadoop为Mapreduce"
}
function len_of_string
{
echo "${#string}"
}
function del_hadoop
{
echo "${string//Hadoop/}"
}
function rep_hadoop_mapreduce_first
{
echo "${string/Hadoop/Mapreduce}"
}
function rep_hadoop_mapreduce_all
{
echo "${string//Hadoop/Mapreduce}"
}
while true
do
echo "[string=$string"
echo
print_tips
read -p "Plese input your choice(1|2|3|4|q|Q)" choice
case $choice in
1)
len_of_string
;;
2)
del_hadoop
;;
3)
rep_hadoop_mapreduce_first
;;
4)
rep_hadoop_mapreduce_all
;;
q|Q)
exit
;;
*)
echo "Error,input only in{1|2|3|4|q|Q}"
;;
esac
done
-
命令替换
总结:``和$()两者都是等价的,推荐初学者使用$(),易于掌握;缺点是极少数UNIX可能不支持,``所有的UNIX都支持。$(())主要用来进行整数运算,包括加减乘除,引用变量前面可以加$,也可以不加$。如 $(($index+1)) == $((index+1))
例子:
1)获取系统的所有用户并输出
cat /etc/passwd | cut -d ":" -f 1
脚本输出
#!/bin/bash
#
index=1
for user in `cat /etc/passwd | cut -d ":" -f 1`
do
echo "This is $index user:$user"
index=$(($index+1))
done
2)根据系统时间计算今年或明年
echo "This is $(date +%Y) year"
echo "Next year is $(($(date +%Y)+1))"
3)根据系统时间获取今年还剩多少星期,已经过了多少星期
#过了多少星期
echo "This year have passed $(($(date +%j)/7)) weeks"
#还剩多少星期
echo "This is $(((365 - $(date +%j))/7)) days before new year"
4)判定nginx进程是否存在,若不存在则自动拉起该进程
#!/bin/bash
#
nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_process_num -eq 0 ];then
systemctl start nginx
fi
-
有类型变量
声明:declare命令和typeset命令都是用来定义变量类型
1)declare -r #声明变量为只读类型
2)declare -i #将变量设为整数。shell默认是将变量以字符串处理,在进行算数运算,默认方式达不到预期效果,如:
可以使用如下方式
或者通过$(())也可以达到预期效果
3)declare -f #显示系统定义的函数和内容
4)declare -F #显示系统定义的函数名
5)declare -a #声明数组
[root@study shell-study]# declare -a array #声明
[root@study shell-study]# array=("jones" "mike" "kobe" "jordan") #赋值
输出数组内容:
echo ${array[@]} # 输出全部内容
echo ${array[1]} #输出下标索引为1的内容
获取数组长度:
echo ${#array} #数组内元素个数
echo ${#array[2]} #数组内下标索引为2的元素长度
给数组某个下标赋值:
array[0]="lily" #给数组下标索引为1的元素赋值为lily
array[20]="hanmeimei" #给数组尾部添加一个新元素
删除元素:
unset array[2] #清除元素
unset array #清空整个数组
分片访问:
echo ${array[@]:1:4} #显示数组下标索引从1开始到3的3个元素
内容替换:
${array[@]/an/AN}
数组遍历
for v in ${array[@]}
do
echo $v
done
6)declare -x #声明为环境变量,可以在脚本中直接使用,反之变量只在该终端能访问,无法在脚本中访问。
取消声明的变量:
declare +r
declare +i
declare +a
declare +x
-
expr数学运算(整数运算)
说明:expr、$(())只能处理整数。$(())处理+、-、*、/,不要处理逻辑运算,因为它无法处理=。
#例子
num1=20
num2=100
expr $num1 \| $num2
expr $num1 \& $num2
expr $num1 \< $num2
expr $num1 \<= $num2
expr $num1 \> $num2
expr $num1 \>= $num2
expr $num1 = $num2
expr $num1 != $num2
expr $num1 + $num2
expr $num1 - $num2
expr $num1 \* $num2
expr $num1 / $num2
expr $num1 % $num2
例子:
1.提示用户输入一个正整数num,然后计算1+2+3+....+num的值;num不满足正整数需要提示
#!/bin/bash
#
while true
do
read -p "pleas input a positive number:" num
expr $num + 1 &> /dev/null # 结果输出到黑洞文件
if [ $? -eq 0 ];then # $? 代表$num + 1的输出,正确输出0,错误输出非0。此处判断是否是整数
if [ `expr $num \> 0` -eq 1 ];then # 判断是否是正整数
for((i=1;i<=$num;i++))
do
sum=`expr $sum + $i`
done
echo "1+2+3+...+$num = $sum"
exit
fi
fi
echo "error,input unlegal"
continue
done
-
数学运算bc(浮点数运算)
例子,使用bc计算两个数的乘积并保留4位小数
#!/bin/bash
#
read -p "num1: " num1
read -p "num2: " num2
# echo "scale=4;$num1*$num2" | bc
num3=`echo "scale=4;$num1*$num2" | bc`
echo "$num1 / $num2 = $num3"