Linux设置字符串变量,详解shell 变量的高级用法示例

变量删除和替换

23ab86828bcbb94c761925781a766487.png

案例:从头开始匹配,将符合最短的数据删除 (#)

variable_1="I love you, Do you love me"

echo $variable_1

variable_2=${variable_1#*ov}

echo $variable_2

134b5fe410b36f5b881a73f074dd5277.png

案例:从头开始匹配,将复合最短的数据删除(##)

varible_3=${variable_1##*ov}

echo $varible_3

aa2c456868c8d01beefa9d0ad05049e0.png

案例:替换字符串,只替换第一次匹配成功的(/)

echo $PATH

var6=${PATH/bin/BIN}

echo $var6

43ced26d43246365ab43a783f5787250.png

案例:替换字符串,符合条件的全部替换 (//)

var7=${PATH//bin/BIN}

echo $var7

701428e6e448036cd9eba6fc1acaaf50.png

变量测试

3ccbd40b78cf5a4a186316571757f16f.png

简单举例(用的比较少)

var=${str-expr}

如果变量 str 没有定义,那么var=expr

如果变量 str的字符串中有值,那么 变量 var 的值就等于 str变量的值

98ddb26cca9fb63dda0a509d2476db1a.png

字符串处理

计算字符串的长度

7edda07fc61d446dbe2dc37e22d4aed5.png

案例1

var="hello world"

len=${#var}

echo $len

fd62a2a5db5a6c5e26f4354ead0643a2.png

案例2

var1="zhang biao"

len=`expr length "$var1"`

echo $len

c1808a24d671ae381e839a80cf6ca05b.png

获取字串在字符串中的索引位置 (把字串拆分成一个个的字串,最先匹配到的第一个就会返回)

6bd3aec19db09ac606a4faab18d1c131.png

案例

var="quickstart is a app"

ind=`expr index "$var" start`

echo $ind

28bb12038b742fed826d1f1c8d17fd89.png

案例 查找一个不存在的字串,返回 1

ind=`expr index "$var" uniq`

echo $ind

df7f8887e3a08a3df161f809befe4af7.png

计算字串的长度 (只能从头开始匹配,用的不多)

bf62cdd7e5077a6826f6e9c2249e65d0.png

例子:找不到返回 0,不是从头开始匹配

var="quickstart is a app"

sub_len=`expr match "$var1" app`

echo $sub_len

6b0d11480fc6c50d2705b9da1c2cbd89.png

从头开始匹配

sub_len=`expr match "$var" quick*`

echo $sub_len

225f7e96e55f61b04b9eb63341ab9c91.png

sub_len=`expr match "$var" quick.*`

echo $sub_len

1b0eb63a0045f7193f669803078b9d7f.png

抽取字串

e1ea10da907bfa99627a06f0f4371563.png

案例:方法一

提取var1中索引从10开始一直到结尾的字符串,索引下标从0开始

var1="kafka hadoop yarn mapreduce"

sub_str1=${var1:10}

echo $sub_str1

bf0843ccf545edf372f5dd14f059f2e0.png

案例:方法二

从第10个位置开始提取5个字符串

sub_str2=${var1:10:5}

echo $sub_str2

0c00a2ab619152f75aeba21efd5c9dc6.png

案例:方法三

取最后的5位

sub_str3=${var1: -5}

echo $sub_str3

e642c31612fce346b9b7ed98cdd0f2bd.png

案例:方法四

取从最后开始取最后5位,注意 var1: -5 之间有空格

sub_str3=${var1:(-5)}

echo $sub_str3

12f564c0d6b57a97e6f18a891656dc16.png

案例:方法五

提取最后5位的前两位

sub_str3=${var1: -5:2}

echo $sub_str3

901e515f37671d252ba7f81e9668c655.png

注意: 使用expr,索引计数是从1开始计算 使用${string:position},索引计数是从0开始

字符串处理完整脚本

需求描述:

变量 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"

echo "********************************************"

}

function len_of_string

{

echo "${#string}"

}

function del_hadoop

{

# 把hadoop替换为空

echo "${string//Hadoop/}"

}

function rep_hadoop_mapreduce_first

{

echo "${string/Hadoop/Mapreduce}"

}

function rep_hadoop_mapreduce_all

{

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

}

3、程序主流程的设计

example.sh

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

}

function len_of_string

{

echo "${#string}"

}

function del_hadoop

{

# 把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 "Pls 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

03a9b6c72d1fede4e364d34e97f1db55.png

命令替换

语法格式

3b96b93ce94a953fbcb16d48b00212c3.png

例子1: 获取系统的所有用户并输

cat /etc/passwd | cut -d ":" -f 1

使用 cut 对 : 进行切割,获取第一个及时用户的名字

for循环能以空格、换行、tab键作为分隔符

sys_user.sh

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

134975738f7f95a874b05078328d5ef1.png

例子2: 根据系统时间计算今年或明年

echo "this is $(date +%Y) year"

echo "this is $(( $(date +%Y) + 1)) year"

06de666492064d76a96b1d8fb3ffcab3.png

总结: ``和$()两者是等价的,但推荐初学者使用$(),易于掌握;缺点是极少数UNIX可能不支持,但``两者都支持 $(())主要用来进行整数运算,包括加减乘除,引用变量前面可以加$,也可以不加$

echo "$((20+30))"

00297bde63fe45283b3289c184f42538.png

示例3

echo $((100+30))

echo $(( (100 + 30) / 13 ))

echo $(( $num1 + $num2 * 2))

shell 语法不是很严格,是否加$都会计算

num1=50

num2=70

echo "$((num1 + num2))"

例子4:

今天是今年的第多少天

echo $(date +%j)

e14dd8ca3c92915fc80fb01e498d3b4f.png

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

echo "this year have passed $(date +%j) days"

echo "this year have passed $(($(date +%j) / 7)) weeks"

9d8cf36536fe38087eba71203da8d8fb.png

今年还剩余多少天

echo "there is $((365 - $(date +%j))) days before new year"

echo "there is $(((365 - $(date +%j)) / 7 )) weeks before new year"

f0bdf2c5c9d746766d47dc99345a7521.png

示例5:判断nginx进程是否存在,如果没有需求拉起这个进程

example_3.sh

#!/bin/bash

#

# grep -v 过滤掉 grep 进程

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

if [ $nginx_process_num -eq 0 ];then

systemctl start nginx

fi

有类型变量

1fd9cd04a4c45a83c575d7bbb3836702.png

4ab57ea290b869dbebfedbd93a0d41db.png

shell编程系列4--有类型变量:字符串、只读类型、整数、数组

declare -r 将变量设置为只读类型

var2="hello python"

declare -r var2

var2="hello java"

636bc66ec3e84a8a2071ee5ab9b05f27.png

declare -i 将变量设为整数

默认把变量当做字符处理

num1=10

num2=$num1+20

echo $num2

d3724a601a64010ca7b661aa8f71d459.png

声明为整数

declare -i num3

num3=$num1+90

echo $num3

1d4d59a2688efec1d0d54641aa3f8d98.png

declare -a 将变量定义为数组

定义数组

declare -a array

array=("jones" "make" "kobe" "jordan")

列出数组所有元素

echo ${array[@]}

04ab607f0eac96073f61e2240c241a36.png

列出其中指定的一个

echo ${array[1]}

b428cf66e2fcd1c2d74a2a2fb58d4d65.png

计算数组长度

echo ${#array[@]}

9724037875fef91ced2cce9fb53b118d.png

输出数组中元素长度

echo ${#array[0]}

2add7a791640bf0bdf125b15881f32da.png

-f 显示此脚本前定义过的所有函数和内容 ,-F 进显示脚本前定义过的函数名

declare -f

declare -F

数组常用的方法(仅供参考,实际生产用的少)

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 清空整个数组

分片访问:

${array[@]:1:4} 显示数组下标索引从1开始到3的3个元素

内容替换:

${array[@]/an/AN} 将数组中所有元素包含an的子串替换为AN

数组遍历:

for v in ${array[@]}

do

echo $v

done

declare -x 将变量声明为环境变量

test1.sh

#!/bin/bash

#

echo $num5

运行shtest1.sh

30281a5936de1d5666f20ae1ad82ab4f.png

当使用declare -x 变量后,就可以直接在脚本中引用了

num5=30

declare -x num5

1d3b4625c30f764f43a39584a1cfab77.png

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值