Shell变量的高级用法
一、变量替换
示例:
1、定义变量
va_1="i love you, do you love me?"
2、打印看看
echo $va_1
显示如下字符串:i love you, do you love me?
3、进行字符替换
var1=${va_1#*ov}
var1如下所示:e you, do you love me?
二、字符串处理
1、获取字符串长度
2、获取子串在字符串中的索引位置
语法:expr index $string $substring
3、计算子串的长度
语法:expr match $string substr
4、抽取子串
三、小练习
问题如下:
Shell脚本如下:
#!/usr/bin/env bash
string="Bigdata process framework is Hadoop,Hadoop is an open source project"
function tips_info
{
echo "******************************************"
echo "*** (1) 打印string长度"
echo "*** (2) 在整个字符串中删除Hadoop"
echo "*** (3) 替换第一个Hadoop为Mapreduce"
echo "*** (4) 替换全部Hadoop为Mapreduce"
echo "******************************************"
}
function print_len
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${#string}"
fi
}
function del_hadoop
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string//Hadoop/}"
fi
}
function rep_hadoop_mapreduce_first
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string/Hadoop/Mapreduce}"
fi
}
function rep_hadoop_mapreduce_all
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string//Hadoop/Mapreduce}"
fi
}
while true
do
echo "【string=\"$string\"】"
tips_info
read -p "Please Switch a Choice: " choice
case "$choice" in
1)
echo
echo "Length Of String is: `print_len`"
echo
continue
;;
2)
echo
echo "删除Hadoop后的字符串为:`del_hadoop`"
echo
;;
3)
echo
echo "替换第一个Hadoop的字符串为:`rep_hadoop_mapreduce_first`"
echo
;;
4)
echo
echo "替换第一个Hadoop的字符串为:`rep_hadoop_mapreduce_all`"
echo
;;
q|Q)
exit 0
;;
*)
echo "error,unlegal input,legal input only in { 1|2|3|4|q|Q }"
continue
;;
esac
done
四、命令替换
一段命令的执行结果是另一个命令的一部分,类似于函数引用
-
例子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
查看系统nginx进程是否存在,若不存在就启动它
#!/bin/bash # nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l) echo "nginx_process_num = $nginx_process_num" if [ $nginx_process_num -eq 0 ];then systemctl start nginx fi
五、有类型变量
1、declare命令
六、数学运算
1、expr命令
2、expr操作符对照表(上)
注意!当使用两变量做比较使用|、&、<、>、<=、>=
符号的时候,需要进行转义,如下:
expr $num1 \>= $num2
3、expr操作符对照表(下)
num3=`expr $num1 + $num2`
4、小练习
提示用户输入一个正整数num,然后计算1+2+3+4+···+num的值,必须对num是否为正整数做判断,不符合的话应当进行再输入
#!/bin/bash
#
while true
do
read -p "pls input a positive number: " num
expr $num + 1 &> /dev/null
if [ $? -eq 0 ];then
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 enlegal"
continue
done
Shell脚本中$0、$?、$!、$$、$*、$#、$@
等的意义说明:
-
$$
Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
-
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
-
$?
最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
-
$-
显示shell使用的当前选项,与set命令功能相同
-
$*
所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个
-
$@
所有参数列表。如"$@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数
-
$@
跟$*类似,但是可以当作数组用
-
$#
添加到Shell的参数个数
-
$0
Shell本身的文件名
-
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…、
七、bc运算
简单介绍:
- bc是bash内建的运算器,支持浮点数运算
- 内建变量scale可以设置,默认为0
1、bc操作符对照表
2、在脚本中使用bc
echo "scale=4;23.33+24" | bc
|
表示将前一条命令的输出,用作后一条命令的输入