变量的高级使用

  • 变量的替换

(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"

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值