Shell脚本备忘录

Shell脚本备忘录目录1.jq1.1安装1.2几个常用例子1.2.1取出数组index=0的内容1.2.2取出数组index=0的name的内容1.2.3以key-value的格式取出数组index=0的name和city1.2.4以key-value的格式取出所有数组的name和city1.2.5以key-value的格式取出数组index=0的name和arrayBrowser的index=1的url1.2.6以key-value的格式取出所有数组的name和city并放在一个数组里(前后加上[])1.

大家好,又见面了,我是你们的朋友全栈君。

1. jq

jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样

1.1 安装

yum -y install jq

1.2 几个常用例子

以这个json结构为例子进行解析,假设文件命名为:json.txt

[{ 
   
	"name": "站长工具",
	"url": "http://tool.chinaz.com",
	"address": { 
   
		"city": "厦门",
		"country": "中国"
	},
	"arrayBrowser": [{ 
   
		"name": "Google",
		"url": "http://www.google.com"
	}, { 
   
		"name": "Baidu",
		"url": "http://www.baidu.com"
	}]
}, { 
   
	"name": "站长之家",
	"url": "http://tool.zzhome.com",
	"address": { 
   
		"city": "大连",
		"country": "中国"
	},
	"arrayBrowser": [{ 
   
		"name": "360",
		"url": "http://www.so.com"
	}, { 
   
		"name": "bing",
		"url": "http://www.bing.com"
	}]
}]

1.2.1 取出数组index=0的内容

cat json.txt | jq '.[0]'

在这里插入图片描述

1.2.2 取出数组index=0的name的内容

cat json.txt | jq '.[0].name'

在这里插入图片描述

1.2.3 以key-value的格式取出数组index=0的name和city

cat json.txt | jq '.[0] | {name:.name, city:.address.city}'

在这里插入图片描述

1.2.4 以key-value的格式取出所有数组的name和city

cat json.txt | jq '.[] | {name:.name, city:.address.city}'

在这里插入图片描述

1.2.5 以key-value的格式取出数组index=0的name和arrayBrowser的index=1的url

cat json.txt | jq '.[0] | {name:.name, url: .arrayBrowser[1].url}'

在这里插入图片描述

1.2.6 以key-value的格式取出所有数组的name和city并放在一个数组里(前后加上[])

cat json.txt | jq '[.[] | {name:.name, city:.address.city}]'

在这里插入图片描述

1.2.7 以key-value的格式取出所有数组的name和city并放在一个数组里并修改name为name2,city为city2

cat json.txt | jq '[.[] | {name2:.name, city2:.address.city}]'

在这里插入图片描述

2. $

  • $0 :Shell 的命令本身
  • $1-9 :表示 Shell 的第几个参数
  • $? :显示最后命令的执行情况
  • $# :传递到脚本的参数个数
  • $$ :脚本运行的当前进程 ID 号
  • $* :以一个单字符串显示所有向脚本传递的参数
  • $! :后台运行的最后一个进程的 ID 号
  • $- :显示 Shell 使用的当前选项
  • $(命令) :执行并获取命令输出

2.1 引用变量用法

  • 直接引用

    [root@localhost testShell]# x=1024
    [root@localhost testShell]# echo $x
    x
    
  • 利用双引号

    [root@localhost testShell]# x=1024
    [root@localhost testShell]# echo "x=$x"
    x=1024
    
  • 使用 ${ } 作为单词边界

    [root@localhost testShell]# x=1024
    [root@localhost testShell]# echo "x=${x}-123"
    x=1024-123
    
  • 使用 ${#} 获取变量字符串长度

    [root@localhost testShell]# x=1024
    [root@localhost testShell]# echo "length=${#x}"
    length=4
    

2.2 引用脚本或函数参数

  • 1 表示 Shell 脚本文件名,n 从 2 开始表示第 n 个参数,第 2 个参数是 $2

    [root@localhost testShell]# echo 'echo $1 $2 $3' > hello.sh
    [root@localhost testShell]# cat hello.sh 
    echo $1 $2 $3
    [root@localhost testShell]# sh hello.sh 1 2 3
    1 2 3
    
  • 使用 $# 获取脚本或函数参数的个数

    [root@localhost testShell]# echo 'echo $#' > hello.sh
    [root@localhost testShell]# cat hello.sh 
    echo $#
    [root@localhost testShell]# sh hello.sh 1 2 3 4 5 6 
    6
    

2.3 上条命令的返回值

使用 $? 上条命令的返回值。

0:表示没有错误,其他任何数值:表示有错误。

[root@localhost testShell]# echo 111 > 1.sh
[root@localhost testShell]# rm 2.sh
rm: cannot remove ‘2.sh’: No such file or directory
[root@localhost testShell]# echo $?
1
[root@localhost testShell]# rm 1.sh 
rm: remove regular file ‘1.sh’? y
[root@localhost testShell]# echo $?
0

2.4 执行并获取命令输出

[root@localhost testShell]# echo $(date)
Tue Aug 17 06:50:29 EDT 2021

2.5 获取当前进程 ID

[root@localhost testShell]# echo $$
80329

2.6 获取后台运行的最后一个进程 ID

[root@localhost testShell]# echo 'ping www.baidu.com' > ping.sh
[root@localhost testShell]# tail -f ping.sh &
[1] 88991
[root@localhost testShell]# echo $!
88991
[root@localhost testShell]# kill $!
[root@localhost testShell]# echo $!
88991
[1]+  Terminated              tail -f ping.sh

2.7 获取 Shell 选项

[root@localhost testShell]# echo $-
himBH

3. “

被`包含的内容会直接执行

4. 去掉字符串最外面双引号

echo "内容" | sed 's/\"//g'

5. debug模式

set -x

6. 字符替换

/要替换的字符串(只找第一个)/替换成的字符串
//要替换的字符串(全部替换)/替换成的字符串

[root@localhost testShell]# url=www.baiud.com
[root@localhost testShell]# echo ${net/baidu/google}
www.google.com
[root@localhost testShell]# echo ${net//./-}
www-baidu-com
[root@localhost testShell]# echo ${net/./-}
www-baidu.com

7. 字符串截取

#查找的字符串
%查找的字符串

[root@localhost testShell]# url=www.baiud.com
[root@localhost testShell]# echo ${url#*www.}
baidu.com
[root@localhost testShell]# echo ${url%*.com}
www.baidu

8. =赋值的时候,两边不能出空格,不然会被认为是命令

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152901.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • es6模板字符串和占位符${}「建议收藏」

    es6模板字符串和占位符${}「建议收藏」描述:  模板字符串使用反引号()来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(KaTeXparseerror:Expected’EOF’,got’&’atposition20:…ression})的占位符。&̲emsp; &ems…{}放变量…

    2022年8月21日
    18
  • AbstractMethodError 错误「建议收藏」

    AbstractMethodError 错误「建议收藏」问题描述:tomcat部署的war包,启动tomcat的时候正常,但是访问项目的时候一直报500,查看tomcat的报错日志如下:java.lang.AbstractMethodError:javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;处理方法:查了一下和依赖中的一些jersey相关的包冲突导致的,可以看看pom.xml文件中的两个依赖,<dependency&gt.

    2022年6月2日
    74
  • linux服务器部署kvm

    linux服务器部署kvm

    2021年6月3日
    114
  • 二进制的减法

    二进制的减法注:正数的补码是其自身负数的补码是其反码+1这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。其实减法也可以看成加法6+(-4)无论加减法总结:补码相加结果再求补码1表示负0表示正在计算机中,负数是使用它的补码来表示的。所谓补码,就是反码+1。所谓反码,就是二进制数逐位取反。所谓逐位取反,就是1变成0,0变成1。例如:原来的二进制数:1011011101101反码:01001000100..

    2022年6月18日
    32
  • Quartz定时任务[通俗易懂]

    一、Quartz的核心概念1.任务jobjob就是想要实现的任务类,每一个job必须实现job接口,且实现接口中的excute()方法。2.触发器TriggerTrigger为你执行任务的触发器,可以设置特定时间执行该任务Trigger主要包含SimpleTrigger和CronTrigger两种3.调度器SchedulerScheduler为任务的调度器,它会将任务job及触发器…

    2022年4月18日
    72
  • 同步锁-线程安全问题解决方案「建议收藏」

    同步锁-线程安全问题解决方案「建议收藏」1同步锁1.1前言经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象.上节笔记点这里-进程与线程笔记我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件:在多线程程序中+有共享数据+多条语句操作共享数据多线程的场景和共享数据的条件是改变不了的(就像4个窗口一起卖100张票,这个是业务)所以思路可以从第3点”多条语句操作共享数据”入手,既然是在这多条语句操作数据过程中出现了问题那我们可以把有可能出现问题的代码都包裹起来,一次只让一

    2022年7月15日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号