一、变量替换
示例:
1、定义变量
1
| va_1="i love you, do you love me?"
|
2、打印看看
显示如下字符串: i love you, do you love me?
3、进行字符替换
var1如下所示: e you, do you love me?
二、字符串处理
1、获取字符串长度
2、获取子串在字符串中的索引位置
语法: expr index $string $substring
3、计算子串的长度
语法: expr match $string substr
4、抽取子串
三、小练习
问题如下:
Shell脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #!/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
获取系统所有用户并输出
1 2 3 4 5 6 7 8 9
| #!/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进程是否存在,若不存在就启动它
1 2 3 4 5 6 7 8 9 10
| #!/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操作符对照表(上)
注意!当使用两变量做比较使用 |、&、<、>、<=、>=
符号的时候,需要进行转义,如下:
3、expr操作符对照表(下)
1
| num3=`expr $num1 + $num2`
|
4、小练习
提示用户输入一个正整数num,然后计算1+2+3+4+···+num的值,必须对num是否为正整数做判断,不符合的话应当进行再输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/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” … “$n” 的形式输出所有参数
$@
跟$*类似,但是可以当作数组用
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…、
七、bc运算
简单介绍:
- bc是bash内建的运算器,支持浮点数运算
- 内建变量scale可以设置,默认为0
1、bc操作符对照表
1、加减乘除
2、求余以及指数运算
2、在脚本中使用bc
1
| echo "scale=4;23.33+24" | bc
|
|
表示将前一条命令的输出,用作后一条命令的输入