为了账号安全,请及时绑定邮箱和手机立即绑定

详解Linux Shell(变量与grep)

标签:
Linux

变量

变量替换

  • ${变量名**#**匹配规则}
    • 从变量开头进行规则匹配,将符合最的数据删除
  • ${变量名**##**匹配规则}
    • 从变量开头进行规则匹配,将符合最的数据删除
    • 贪婪模式
  • $(变量名**%**匹配规则}
    • 从变量尾部进行规则匹配,将符合最短的数据删除
  • $(变量名%%匹配规则}
    • 从变量尾部进行规则匹配,将符合最长的数据删除
  • $(变量名**/**旧字符串/新字符串)
    • 变量内容符合旧字符串则,则第一个旧字符串会被新字符串取代
  • ${变量名**//**旧字符串/新字符串}
    • 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代
      图片描述

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

计算字符串长度

  • $(#string}无
  • expr length “$string”
    • string有空格,则必须加双引号

获取子串在字符串中的索引位置

  • expr index $string $substring

计算子串长度

 - expr match $string substr
 - 只能从头开始查找

抽取字串

  • ${string:position}
    • 从string中的position开始
  • ${string:position:length}
    • 从position开始,匹配长度为length
  • $(string:-position}
    • 从右边开始匹配
  • ${string:(position)}
    • 从左边开始匹配
  • expr substr $string Sposition $length
    • 从position开始,匹配长度为length

案例

需求描述:

变量string="Bigdata process framework is Hadoop“执行脚本后,打印输出string字符串变量,并给出用户以下选项:
(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Mapreduce
(4)、替换全部Hadoop为Mapreduce
用户输入数字1,2,3,4,可以执行对应项的功能;输入qlQ则退出交互模式

#!/bin/bash
#
string="Hadoop Mapreduce"
function print_tips
{
	echo "****************"
	echo "(1)打印string长度"
	echo "(2)删除字符串中所有的Hadoop"
	echo "(3)替换第一个Hadoop为Mapreduce"
	echo "(4)替换全部Hadoop为Mapreduce"
	echo "****************"
}
function len_of_string
{
	echo "${#stringi}"
}
function del_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 "input your choice  1 2 3 4 q Q" choice
	case $choice in
		1)
			1en_of_string
			;;
		2)
			del_hadoop
			;;
		3)
			rep hadoop mapreduce first
			;;
		4)
			rep hadoop mapreduce all
			;;
		q|Q)
			exit
			;;
		*)
			echo "error"
			;;


命令替换

  • command
  • $(command)
    获取系统得所有用户并输出
cat /etc/passwd | cut-d ":" -f 1
#!/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 

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

$(($(date+%Y)+1))

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

(((((((date +%j)/7))

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

#!/bin/bash
#
nginx_process_num=$(ps-ef I grep nginx I grep-v grep I wc-1)
if  [ $nginx process num-eq 0];then
systemctl start nginx
fi

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

有类型变量

  • declare命令和typeset命令两者等价
  • declare、typeset命令都是用来定义变量类型的
  • declare
    • -i 将变量设为整数
    • -a 将变量定义为数组
    • -f 显示此脚本前定义过的所有函数及内容
    • -F 仅显示此脚本前定义过的函数名
    • -x 将变量声明为环境变量
declare -a array
array=("jones""mike""kobe""jordan")
echo ${array[@]}

expr

  • expr $num1 operator $num2
  • ((((((num1 operator $num2))

  • num1| nurm2
    • num1不为空且非0,返回num1;否则返回num2
  • num1&num2
    • num1不为空且非0,返回num1;否则返回0
  • num1<num2
    • num1小于num2,返回1;否则返回0
  • num1<=num2
    • num1小于等于num2,返回1;否则返回0
  • num1=num2
    • num1等于num2,返回1;否则返回0
  • num1!=num2
    • num1不等于num2,返回1;否则返回0
  • num1>num2
    • num1大于num2,返回1;否则返回0
  • num1>=num2
    • num1大于等于num2,返回1;否则返回0

grep

  • 第一种形式:grep [option][pattern][file1,file2…]
  • 第二种形式:command Igrep [option][pattern]

  • -v 不显示匹配行信息
  • -i 搜索时忽略大小写
  • -n 显示行号
  • -r 递归搜索
  • -E 支持扩展正则表达式 egrap
  • -F 不按正则表达式匹配,按照字符串字面意思匹配
  • -c 只显示匹配行总数
  • -w 匹配整词
  • -x 匹配整行
  • -l 只显示文件名,不显示内容
  • -s不显示错误信息
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消