Shell编程中变量用法
1. 变量替换
| 语法 | 说明 |
|---|---|
| ${变量名#匹配规则} | 从变量开头进行规则匹配,将符合最短的数据删除 |
| ${变量名##匹配规则} | 从变量开头进行规则匹配,将符合最长的数据删除,贪婪匹配 |
| ${变量名%匹配规则} | 从变量尾部进行规则匹配,将符合最短的数据删除 |
| ${变量名%%匹配规则} | 从变量尾部进行规则匹配,将符合最长的数据删除,贪婪匹配 |
| ${变量名/旧字符串/新字符串} | 将变量中的第一次出现的旧字符串替换成新字符串 【只替换第一次出现的旧字符串】 |
| ${变量名//旧字符串/新字符串} | 将变量中的所有的旧字符串替换成新字符串 【全部的旧字符串进行替换】 |
1.1 示例
$ variable_1="I love you,Do you love me"
$ echo $variable_1
I love you,Do you love me
$ var1=${variable_1#*ov}
$ echo $var1
e you,Do you love me
$ var2=${variable_1##*ov}
$ echo $var2
e me
# 从尾部进行查找,找到第一个即退出
$ var3=${variable_1%ov*}
$ echo $var3
I love you,Do you l
# 从尾部进行查找,贪婪模式,从尾部进行查找,找到最后一个
$ var4=${variable_1%%ov*}
$echo $var4
I l
# 变量替换
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 只是替换第一个出现的地方
$ var5=${PATH/bin/BIN}
$ echo $var5
/usr/local/BIN:/usr/bin:/bin:/usr/sbin:/sbin
# 全部替换
$ var6=${PATH//bin/BIN}
$ echo $var6
/usr/local/BIN:/usr/BIN:/BIN:/usr/sBIN:/sBIN
2. 字符串处理
2.1 计算字符串长度
| 语法 | 说明 | |
|---|---|---|
| 方法一 | ${#string} | 字符串前面加上#,计算字符串的长度 |
| 方法二 | expr length "$string" | 如果字符串string 有空格,则必须加上双引号 |
# 示例 字符串长度
$ var1="Hello World"
$ len1=${#var1}
$ len2=`expr length "${var1}" `
2.2 获取子串在字符串中的索引位置
| 语法 | 说明 | |
|---|---|---|
| 方法 | expr index $string $substring | 并不是获取子串的位置,实际获取的是字符的位置,位置从1开始 |
# 示例 子串在字符串中的索引位置,实际是字符的位置
$ var1="Hello World"
$ idx=`expr index "${var1}" orld` # 这个获取到的位置,实际上是第一次出现o的位置,返回5
2.3 计算子串长度
| 语法 | 说明 | |
|---|---|---|
| 方法 | expr match $string $substring | 可以指定子串,子串必须从字符串的起始位置开始匹配 |
# 示例 子串长度
$ var1="Hello World"
$ sub_len=`expr match "$var1" World` # 此时返回的是 0,子串必须从头开始匹配
$ sub_len=`expr match "$var1" Hell` # 此时返回的是 4
$ sub_len=`expr match "$var1" Hell.*` # 此时返回的是 11 匹配的是整个字符串 . 任意字符 * 多个
2.4 抽取子串
| 语法 | 说明 | |
|---|---|---|
| 方法一 | ${string:position} | 从变量string中的position位置开始提取 ${string:0}提取所有的字符串 |
| 方法二 | ${string:position:length} | 从position位置开始,匹配长度为 length |
| 方法三 | ${string: -position} | 冒号(:)后面必须有个空格,负号表示从尾部开始抽取 -1表示最后一位 |
| 方法四 | ${string:(position)} | 如果position为正左边开始,为负从右边开始 同方法三 |
| 方法五 | expr substr $string $position $length | 从position位置开始,匹配长度为 length |
$ var1="Hello World"
$ sub1=${var1:2}
$ echo $sub1
llo World
$ sub2=${var1:1}
$ echo $sub2
ello World
$ sub2=${var1:0}
$ echo $sub2
Hello World
$ sub2=${var1: 0}
$ echo $sub2
Hello World
$ sub2=${var1:(0)}
$ echo $sub2
Hello World
$ sub2=${var1:(-1)}
$ echo $sub2
d
$ sub2=${var1: -1}
$ echo $sub2
d
$ sub2=${var1:0:5}
$ echo $sub2
Hello
3. 命令替换
命令替换有两种方式
使用 ` 符号包装命令
使用$(命令方式)
# 方法1 `command`
$ var1=`date "+%Y-%m-%d %H:%M:%S"`
# 方法2 $(command)
$ var1=$(date "+%Y-%m-%d %H:%M:%S")
#示例 获取nginx进程的个数
$ nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
4. 有类型变量
使用的命令有 declare 和 typeset
declare 命令和typeset命令两者等价
declare和typeset都是用来定义变量类型的
- declare 命令参数表
| 参数 | 含义, 如果要取消声明的变量,把 - 换成 + 即可 |
| :--- | :-------------------------------------------- |
| -r | 将变量设为只读, |
| -i | 将变量设置为整数 |
| -a | 将变量定义为数组 |
| -f | 显示此脚本前定义过的所有函数及内容 |
| -F | 仅显示此脚本前声明的函数名 |
| -x | 将变量声明为环境变量,小写的x |
# 只读变量
$ declare -r var1="hell0"
$ echo $var1
hell0
$ var1="aaa"
bash: var1: readonly variable
# 整型变量
$ num1=10 # 默认定义的变量为字符串变量
$ number=$num1+20 # 默认不会进行数学计算
10+20
# 需要需要进行数学计算,使用 expr
$ expr $num1 + 10
20
# 使用decalre声明整型变量
$ declare -i num3=50
$ num3=$num1+90
$ echo $num3
100
# 定义数组
$ declare -a array
$ array=("java" "python" "C" "C++") # 数组赋值,注意用空格进行分割,不是逗号
$ echo ${array[0]} # 输出数组第一个位置上的值, 数组下标索引从0开始
java
$ echo ${#array[@]} # 输出数组中元素的个数
4
$ echo ${#array[1]} # 输出数组中索引下标为1位置的元素的长度
6
$ echo ${array[@]:1:3} # 输出数组中下标冲1位置开始到下标为3位置结束的元素
python C C++
$ echo ${array[@]/on/ON} # 将数组中所有的 on 替换成 ON
java pythON C C++
$ array[0]="go" # 将数组中的下标为0的索引位置上的值进行重新赋值
$ echo ${array[@]}
go python C C++
$ unset array[0] # 删除数组下标为0的那个元素
$ echo ${array[@]}
python C C++
$ unset array # 清空数组中的内容
#定义环境变量
$ declare -x num5 # 声明环境变量num5
$ num5=90
$ declare +x num5 # 取消声明的环境变量
5. bash数学运算
5.1 整数的运算
| 语法, operator 也可以是比较大小的运算符 | |
|---|---|
| 方法一 | expr $number1 operator $ number2 |
| 方法二 | $(($number1 operator $ number2)) ,尽量采用expr 进行数学运算 |
## 1.bash 数学运算之expr
# | & < > * >= <= 等运算符需要进行转译, 如果为真 返回 1,否则返回0
# 两个运算符之间必须都要有空格
# $? 这个值代表命令的返回值
expr $num1 \| $num2 # num1 不为空且非0,返回num1; 否则返回num2
expr $num1 \& $num2 # num1 不为空且非0,返回num1; 否则返回0
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
# 判断 num1 是整数
expr $num + 1 &> /dev/null # 只有整数变量才能进行数学运算,浮点数不可以
# 命令运算结果为 0 表示 可以进行数学运算 $? -eq 0
5.2 浮点数运算
bc是bash内建的运算符,支持浮点数运算
内建变量scale可以设置,默认是0, 指定小数位数
$ echo "23+45" | bc
68
$ echo "23.2+45" | bc
68.2
$ echo "23.2+45.65" | bc
68.85
$ echo "23.2+45.657" | bc
68.857
$echo "23.2/5.657" | bc
4
$ echo "scale=4;23.2/5.657" | bc
4.1011
Shell编程中变量用法的更多相关文章
- shell编程中变量的运算 (shell 06)
主要包括以下3种 字符串操作数学运算浮点运算 一.字符串操作 字符串的连接 连接字2个字符串不需要任何连接符,挨着写即可 长度获取 expr length "hello" expr ...
- Shell编程中Shift的用法
Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...
- Shell编程中while与for的区别及用法详解【转】
在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...
- (转)轻松掌握shell编程中数组的常见用法及示例
缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...
- Shell编程中Shift的用法【转】
本文转载自:http://www.cnblogs.com/image-eye/archive/2011/08/20/2147153.html Shell编程中Shift的用法 位置参数可以用shift ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
- Linux —— Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- shell编程中的单/双 小括号, 中括号, 大括号
linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...
- Linux学习——shell编程之变量
shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...
随机推荐
- 金牛来到,福气来到——TcaplusDB新年放送
光阴似箭,2020转瞬间成为历史,牛年的钟声即将敲响,在此,TcaplusDB祝大家新的一年万事如意,牛年带给我们的福气,一定能让我们心想事成! 饮水思源,回顾过去的一年,我们深知,TcaplusDB ...
- 怎样优化SQL
[原则一:选择需要优化的SQL] 1,选择需要优化的SQL:不是所有的SQL都需要优化,在优化的过程中,首选更需要优化的SQL; 怎么选择?优先选择优化高并发低消耗的SQL: 1,1小时请求1W次,1 ...
- 手摸手带你学移动端WEB开发
HTML常用标签总结 手摸手带你学CSS HTML5与CSS3知识点总结 手摸手带你学移动端WEB开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/Ro ...
- 【原创】docker & kubernetes问题总结
1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...
- dll的注册与反注册
regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:regsvr32 [/i[:cmdline]] DLL文件名命令可以在"开始→运行 ...
- .NET中使用DebuggerDisplay轻松定制调试
前言 对于调试的方式有多种,不过在今天我们将看到的监视窗口对变量的监视,当然在这里我们是定制内部的变量值,或者说变量的显示与计算的内容. 注:监视窗口在调试时可以一次显示多个变量."快速监视 ...
- 1. mac 手动安装nodejs搭建vue环境
为什么选择手动安装nodejs呢? 因为使用mac自动安装还要更新homebrew,还要安装xcode tool, 太费劲了,不如手动安装, 卸载起来也方便 再一个, 我是后台开发者, 对前端页面, ...
- H5 页面如何展示大量的表格数据
H5 页面如何展示大量的表格数据 列数过多 图表化 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- HTML5 Canvas 2D library All In One
HTML5 Canvas 2D library All In One https://github.com/search?q=Javascript+Canvas+Library https://git ...
- js currying All In One
js currying All In One 柯里化 refs https://juejin.im/post/6844903603266650125 xgqfrms 2012-2020 www.cnb ...