shell进阶指南

一、变量替换

语法含义
${变量#pattern}从开头匹配,删除0第一个匹配到字符删除。双#表示删除0匹配到的最后一个字符呢删除
${变量%patther}从尾部开始匹配,从尾部开始删除,其他同上
${变量/oldstr/newstr}匹配第一个替换,双//表示全部替换
var1=${variable_1#*ov}
var2=${variable_1##*ov}


echo "# *ov匹配结果:" $var1
echo “## *ov匹配结果:” $var2


var3=${variable_1%ov*}
var4=${variable_1%%ov*}


echo "%  ov*匹配结果:" $var3

echo '%% ov*匹配结果:' $var4


var5=${variable_1/love/hate}
var6=${variable_1//love/hate}
"var_replace.sh" 26L, 407C                 

测试结果

[root@server1 shell]# sh var_replace.sh 
# *ov匹配结果: e shell,but it is so hard,do you love it
“## *ov匹配结果:” e it
%  ov*匹配结果: I love shell,but it is so hard,do you l
%% ov*匹配结果: I l
 I hate shell,but it is so hard,do you love it
 I hate shell,but it is so hard,do you hate it

重点掌握替换即可,前两种场景较少,可以通过其他方式替代

二、字符串常用处理

获取字符串长度

# 方法1
${#string}

# 方法2
expr length "$string"

获取字符位置(忽略)

这里index的下标1而不是0开始,建议忽略本段

比较鸡肋的功能,是把后面字符串拆解后,第一个字符匹配到的位置

expr index $string str

这里搜索d和l字符在字符串中第一次出现的位置,L先出现第3位所以数字式3

[root@server1 shell]# var="hellowrod"
[root@server1 shell]# echo `expr index $var dl`
3

[root@server1 shell]# echo `expr match $var *llo`
0
[root@server1 shell]# echo `expr match $var hello`
5


截取字符串

方法很多我们只记住一种即可,索引下标从0开始

# 方法1
${string:start:length} 从start开始提取长度为length的字符串
# 方法2
expr substr $string $position  $length
#!/bin/bash
#length test
var="hello world"
var1len=${#var}
var1len2=`expr length "$var"`
echo $var1len  "|" $var1len2


# substr test

varsub1=${var:2:3}
# 变量需要双引号,原因不明
varsub2=`expr substr "$var"  2 3`

echo "substr 2:3" $varsub1 "|" $varsub2

测试结果

[root@server1 shell]# sh substr.sh 
11 | 11
substr 2:3 llo | ell

三、命令替换

将命令执行结果赋值变量

# 方法1 
`command`
# 方法2
$(command)
#!/bin/bash

for user in `cat /etc/passwd | cut -d ":" -f 1`
do
        echo $user
done

# 示例2
[root@server1 ~]# echo "next year is $(($( date +%Y ) + 1))"
next year is 2022

$() 和 $(())

  • 一个括号代表命令替换
  • 两个括号代表算数元素那

`` 和 $()

  • 两者基本对等
  • $()在某些unix系统可能不支持,但支持嵌套
  • 反引号在嵌套时需要转义

四、有类型变量

参数含义
-r只读
-i整形,shell默认把变量当做字符串
-a数组
-x声明为环境变量
# 只读变量
[root@server1 shell]# declare -r var
[root@server1 shell]# var=helo3
-bash: var: readonly variable
# 整形变量

# 数组

[root@server1 shell]# declare -a array1
[root@server1 shell]# array1=("zhangsan" "lisi" "wangwu")
[root@server1 shell]# echo array1[@]
array1[@]
[root@server1 shell]# echo ${array1[@]}
zhangsan lisi wangwu
[root@server1 shell]# echo ${array1[1]}
lisi


五、数学运算

# 方法1
expr $num1 operator $num2
$(($num1 operator $num2))  
不能用来比较,只能加减乘除
操作符含义
num1 | num2num1非空非零返回num1,否则返回num2
num1 & num2num1非空非零返回num1,否则返回0

表达式 | 表达式为真返回1,否则返回0

[root@server1 shell]# num1=30
[root@server1 shell]# num2=50

# 需要转义
[root@server1 shell]# expr $num1  > $num2
[root@server1 shell]# expr $num1  \> $num2
0
[root@server1 shell]# expr $num1 + $num2
80
[root@server1 shell]# expr $num1 / $num2
0

第二种语法
[root@server1 shell]# echo $((num1%num2))
30

示例,提示输入数字,判断数据合法性,并计算求和结果
通过脚本联系增加对shell细节的理解

#/bin/bash
while true
do
        read -p "pls input a positive numbser:" num

        # 判断变量是否为正整数
        # 整数才能原酸
        expr $num + 1 &> /dev/null

        if [ $? -eq 0  ];then

                if [ `expr $num \> 0` -eq  1  ];then
                        echo "yes,$num is a positive numbser"
                        sum=0
                        for ((i=1; i<=$num; i++))
                        do
                                sum=$((sum + $i ))
                        done
                        echo "sum is $sum"
                        exit
                else
                        echo "no"
                fi
        fi
        echo "erro input"
done

浮点数运算
bc指定scale可以进行浮点值的运算,scale=n可以指定小数后位数

# 交互式方式
[root@server1 shell]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
3+t
3
3+5
8
3/5
0
scale=2
3/5
.60


# 脚本中写法
[root@server1 shell]# echo "scale=2;$((3/5))" | bc
0
[root@server1 shell]# echo "scale=2;3/5" | bc
.60

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值