热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxshell变量的高级用法,Shell编程之变量的高级用法详解

变量替换语法说明${变量名#匹配规则}从变量开头进行规则匹配,将符合最短的数据删除${变量名##匹配规则}从变量开头进行规则匹配,将符合最长的数据删除$

变量替换

语法

说明

${变量名#匹配规则}

从变量开头进行规则匹配,将符合最短的数据删除

${变量名##匹配规则}

从变量开头进行规则匹配,将符合最长的数据删除

${变量名%匹配规则}

从变量尾部进行规则匹配,将符合最短的数据删除

${变量名%%匹配规则}

从变量尾部进行规则匹配,将符合最长的数据删除

${变量名/旧字符串/新字符串}

变量内容符合就字符串,则第一个旧字符串会被新字符串替换

${变量名//旧字符串/新字符串}

变量内容符合就字符串,则全部的旧字符串会被新字符串替换

示例

var1="hello world hello world"

# 所谓最长和最短其实就是正则表达式中的贪婪模式和非贪婪模式

# 删除匹配规则为*lo的数据(开头最短删除)

echo ${var1#*lo}

-> world hello world

# 删除匹配规则为*lo的数据(开头最长删除)

echo ${var1##*lo}

-> world

# 删除匹配规则为hel*的数据(尾部最短删除)

echo ${var1%hel*}

->hello world

# 删除匹配规则为hel*的数据(尾部最长删除)

echo ${var1%%hel*}

->

# 替换第一个旧字符串world为Beijing

echo ${var1/world/Beijing}

->hello Beijing hello world

# 替换第一个旧字符串world为Beijing

echo ${var1/world/Beijing}

->hello Beijing hello Beijing

变量测试

变量置换方式

变量y没有设置

变量y为空值

变量y设置值

x=${y-新值}

x=新值

x为空

x=$y

x=${y:-新值}

x=新值

x新值

x=$y

x=${y+新值}

x为空

x=新值

x=新值

x=${y:+新值}

x为空

x为空

x=新值

x=${y=新值}

x=新值

x为空

x=$y

y=新值

y值不变

y值不变

x=${y:=新值}

x=新值

x=新值

x=$y

y=新值

y=新值

y值不变

x=${y?新值}

新值输出到标准错误输出(屏幕)

x为空

x=$y

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

如果大括号内没有":",则变量 y 为空或没有被设置,处理方法是不同的;如果大括号内有":",则变量 y

不论是为空,还是没有被设置,处理方法是一样的;

如果大括号内是"-“或”+",则在改变变量 x 的值的时候,变量 y 的值是不改变的;

如果大括号内是"=",则在改变变量 x 的值的同时,变量 y 的值也会改变;

如果大括号内是"?",则当变量 y 不存在或为空时,会把"新值"当成报错输出到屏幕上。

示例

# x=${y-新值}

echo ${y=$var1}

->hello world hello world

y=

echo ${y-$var1}

->

y=hello Beijing

echo ${y-$var1}

->hello Beijing

# x=${y:-新值}

echo ${y:-$var1}

->hello world hello world

y=

echo ${y:-$var1}

->hello world hello world

y=hello Beijing

echo ${y:-$var1}

->hello Beijing

# x=${y+新值}

echo ${y+$var1}

->

y=

echo ${y+$var1}

->hello world hello world

y=hello Beijing

echo ${y+var1}

->hello world hello world

# x=${y:+新值}

echo ${y:+$var1}

->

y=

echo ${y:+$var1}

->

y=hello Beijing

echo ${y:+var1}

->hello world hello world

# x=${y=新值}

x=${y=$var1}

echo $x

->hello world hello world

echo $y

->hello world hello world

y=

x=${y=$var1}

echo $x

->

echo $y

->

y=hello Beijing

x=${y=$var1}

echo $x

->hello world hello world

echo $y

->hello Beijing

# x=${y:=新值}

x=${y:=$var1}

echo $x

->hello world hello world

echo $y

->hello world hello world

y=

x=${y:=$var1}

echo $x

->hello world hello world

echo $y

->hello world hello world

y=hello Beijing

x=${y:=$var1}

echo $x

->hello Beijing

echo $y

->hello Beijing

# x=${y?新值}

echo ${y?$var1}

->-bash: y: hello world hello world

y=

echo ${y?$var1}

->

y=hello Beijing

echo ${y?$var1}

->hello Beijing

# x=${y:?新值}

echo ${y?$var1}

->-bash: y: hello world hello world

y=

echo ${y:?$var1}

->-bash: y: hello world hello world

y=hello Beijing

echo ${y:?$var1}

->hello Beijing

看完了我还是记不住!!参考上表吧!

字符串处理

字符串长度

语法

说明

方法一

${#string}

方法二

expr length "$string"

string有空格,则必须加双引号

示例

# 方法一

var1="hello world"

echo ${#var1}

->11

# 方法二

len=`expr length "$var1"`

echo $len

->11

## var1有空格,必须加双引号,否则报错

expr: syntax error

## var2没有空格,可以不需要加双引号

var2=hello

expr length $var2

5

子串字符索引

语法

expr index $string $substring

string/substring有空格,则必须加双引号

此方法并不是查找子串的索引位置,它会把子串进行字符拆分,哪个字符最先找到了则返回其索引位置。并且索引从1开始

expr index "$var1" llo

->3

expr index "$var1" lole

->2

子串长度

语法

expr match $string substring

string/substring有空格,则必须加双引号

expr match "$var1" hel

->3

expr match "$var1" llo

->0

expr match $string substring获取子串长度必须是从头开始匹配

抽取子串

语法

说明

方法一

${string:position}

从string中的position开始抽取子串

方法二

${string:position:length}

从string中的position开始,抽取长度为length的子串

方法三

${string: -position}

(注意-position前有个空格)从尾部开始的position抽取子串

方法四

${string:(position)}

从string中的头部开始的position抽取子串

方法五

expr substr $string $position $length

从string中的position开始,抽取长度为length的子串

示例

# 方法一

echo ${var1:2}

->llo world

# 方法二

echo ${var1:2:5}

->llo w

# 方法三

echo ${var1: -2}

->ld

echo ${var1: -2:1}

->l

# 方法四

echo ${var1:(3)}

->lo world

echo ${var1:(3):2}

->lo

echo ${var1:(-2):1}

->l

# 方法五

expr substr "$var1" 2 5

->ello

注意:expr substr $string $position $length的position从1开始,而${string:position:length}的从0开始。

var2=hello

echo ${var2:2:5}

->llo

expr substr $var2 2 5

->ello

小试牛刀

需求描述:变量string="Bigdata process framework is Hadoop,Hadoop is an open source project."执行脚本后,打印输出string字符串变量,并给出用户一下选项:

打印string长度

删除字符串中所有的Hadoop

替换第一个Hadoop为Mapreduce

替换所有Hadoop为Mapreduce

用户输入数字1|2|3|4,可以执行对应项的功能;输入q|Q则退出交互模式。

#!/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"

echo "q|Q->退出"

echo "=============================="

}

function len_of_string

{

echo "${#string}"

}

function del_hadoop

{

echo "${string//Hadoop/}"

}

function rep_first_hadoop_mapreduce

{

echo "${string/Hadoop/Mapreduce}"

}

function rep_all_hadoop_mapreduce

{

echo "${string//Hadoop/Mapreduce}"

}

while true

do

echo ""

echo ""

echo ""

echo ""

echo "【string=$string】"

print_tips

read -p "Please input your choice (1|2|3|4|q|Q):" choice

case $choice in

1)len_of_string;;

2)del_hadoop;;

3)rep_first_hadoop_mapreduce;;

4)rep_all_hadoop_mapreduce;;

q|Q)exit;;

*)echo "Error input,only in (1|2|3|4|q|Q)";;

esac

done

命令替换

Shell 命令替换是指将命令的输出结果赋值给某个变量。比如,在某个目录中输入 ls 命令可查看当前目录中所有的文件,但如何将输出内容存入某个变量中呢?这就需要使用命令替换了,这也是 Shell 编程中使用非常频繁的功能。

语法

方法一

`command`

方法二

$(command)

示例

# 获取系统的所有用户并输出

#!/bin/bash

index=1

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

do

echo "这是第 $index 个用户,名称为:$user"

index=$(($index + 1))

# $(())主要用来进行整数运算,引用变量前面可以加$也可以不加

done

# 根据系统时间计算今年或明年

#!/bin/bash

year=`date +%Y`

echo "今年是$year年,明年是$(($year+1))年"

# 根据系统时间获取今年还剩下多少星期,已经过了多少星期

#!/bin/bash

# 计算现在是今年第几天

#!/bin/bash

days=$(date +%j)

weeks=$((days/7))

remain_weeks=$((52-weeks))

echo "今年还剩$remain_weeks个星期,已经过了$weeks个星期"

# 判定nginx进程是否存在,若不存在则自动拉起进程

#!/bin/bash

nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)

if [ $nginx_process_num -eq 0 ];then

echo "nginx未启动,拉起中..."

systemctl start nginx

else

echo "nginx已启动..."

fi

有类型变量

在之前的变量声明中都是没有指定变量类型的,在Shell编程中如果需要为变量指定类型则需要使用declare和typeset命令。这两个命令是等价的。(下表中-号为添加,取消则使用+号,如+x)

参数

含义

-r

将变量设置为只读

-i

将变量设置为整数

-a

将变量定义为数组

-f

显示此脚本前定义过的所有函数及内容

-F

仅显示此脚本前定义过的函数名

-x

将变量声明为环境变量

示例

# 设置为只读

var1="hello wordl"

var1="hello shell"

declare -r var1

var1="hello java"

->-bash: var1: readonly variable

# 设置为整形

num1=20

num2=$num1+30

echo $num2

->20+30 #linux默认设置为字符串

declare -i num3

num3=$num1+30

echo $num3

->50

# 定义数组

declare -a array

array=(1 2 3 4)

# 输出全部内容

echo ${array[@]}

# 输出下标索引为1的内容

echo ${array[1]}

# 数组内元素个数

echo ${#array[@]}

# 指定索引赋值

array[0]=555

# 尾部添加元素

array[4]=666

# 删除元素

# 删除索引为2的元素

unset array[2]

# 清空整个数组

unset array

# 分片访问

# 显示数组下标索引从1开始到3的三个元素(包头不包尾)

${array[@]:1:4}

# 数组遍历

for n in ${array[@]}

do

echo $n

done

# 显示脚本前定义过的所有函数及内容

# 在前问小试牛刀的print_tips方法后添加declare -f,即可发现只显示了命令前的函数及内容

数学运算之expr

expr操作符对照表:

操作符

含义

num1 | num2

num1不为空且非0,返回num1;否则返回num2

num1 & num2

num1不为空且非0,返回num1;否则返回0

num1

num1小于num2,返回1;否则返回0

num1 <&#61; num2

num1小于等于num2&#xff0c;返回1;否则返回0

num1 &#61; num2

num1等于num2&#xff0c;返回1;否则返回0

num1 !&#61; num2

num1不等于num2&#xff0c;返回1;否则返回0

num1 > num2

num1大于num2&#xff0c;返回1;否则返回0

num1 >&#61; num2

num1大于等于num2&#xff0c;返回1;否则返回0

注意&#xff1a;如果需要在命令行中使用这些运算需要转义&#xff0c;如expr $num1 \| $num2,expr $num1 \> $num2,否则报错。

num1&#61;20

num2&#61;100

expr $num1 \| $num2

expr $num1 \& $num2

expr $num1 \<$num2

expr $num1 \<&#61; $num2

expr $num1 \> $num2

expr $num1 \>&#61; $num2

expr $num1 &#61; $num2

expr $num1 !&#61; $num2

expr $num1 &#43; $num2

expr $num1 - $num2

expr $num1 \* $num2

expr $num1 / $num2

expr $num1 % $num2

数学运算之bc

bc是bash内建的运算器&#xff0c;支持浮点数运算。默认情况下bc运算精确到整数&#xff0c;可以设置scale来保留指定位数的小数。

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 &#96;warranty&#39;.

23/5

4

scale&#61;2

23/5

4.60

在shell中通常通过管道来使用bc。如:echo "2.5/3.65" | bc或echo &#39;scale&#61;2; (2.777 - 1.4744)/1&#39; | bc。注意&#xff1a;后者的/1操作&#xff0c;如果不进行除法则无法保留指定位数的小数

bc 除了 scale 来设定小数位之外&#xff0c;还有 ibase(输入数据的进制) 和 obase(输出的数据进制) 来其它进制的运算。

echo "ibase&#61;2;111" |bc

->7

echo "obase&#61;2;192" |bc

->11000000

到此这篇关于Shell编程之变量的高级用法详解的文章就介绍到这了,更多相关Shell 变量的高级用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家&#xff01;



推荐阅读
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 在 Vue 项目中,为了提高页面加载速度和优化用户体验,实现图片上传前的压缩处理至关重要。本文介绍了如何通过集成第三方库和自定义组件,有效减小图片文件大小,确保在不影响图像质量的前提下,提升应用性能。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
author-avatar
小木马
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有