shell进阶指南

Posted 如何在5年薪百万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于shell进阶指南的主要内容,如果未能解决你的问题,请参考以下文章

SHELL脚本编程进阶

SHELL脚本编程进阶

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

Markdown进阶指南

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Python 进阶指南(编程轻松进阶):十六面向对象编程和继承