一、shell命令-pushd和popd

操作directory stack一共需要3个命令:

dirs 、pushd、popd

dirs: 显示当前目录栈中存在的目录

pushd: 把目录放入栈中

popd: 把目录从栈中移除

pushd用法:

1.pushd 目录
pushd后面如果直接跟目录使用,会切换到该目录并且将该目录置于目录栈的栈顶。(时时刻刻都要记住,目录栈的栈顶永远存放的是当前目录。如果当前目录发生变化,那么目录栈的栈顶元素肯定也变了;反过来,如果栈顶元素发生变化,那么当前目录肯定也变了。)

2.pushd不带任何参数
pushd不带任何参数执行的效果就是,将目录栈最顶层的两个目录进行交换。前面说过,栈顶目录和当前目录一个发生变化,另一个也变。这样,实际上,就实现了cd -的功能

3.pushd +n
pushd +n切换到目录栈中的第n个目录(这里的n就是dirs -v命令展示的index),并将该目录以栈循环的方式推到栈顶

popd用法:

每次popd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容

1.popd不带参数
popd不带任何参数执行的效果,就是将目录栈中的栈顶元素出栈。这时,栈顶元素发生变化,自然当前目录也会发生相应的切换(接上文的执行现场)

2.popd +n
将目录栈中的第n个元素删除(这里的n就是命令dirs -v显示的目录index)

实操:

最初在根目录下执行 dirs -v ,结果如下:

这表明当前只有一个目录在zhan中;

接着执行mkdir nihao 创建个目录,然后执行pushd nihao,把这个目录放在栈中,如下:

然后再执行dirs -v就可以看到nihao这个目录已经放在栈中:

执行pushd 不带参数 命令,会使栈中顶层的俩目录替换掉,并切换当前目录到栈中当前的最顶层的目录下,如下:

其他命令一样,在此不一一演示了;

二、[-n "str"] [-d "$XXX"]用法:
shell if [ -n ] 正确使用方法
if [ str1 = str2 ]       当两个串有相同内容、长度时为真 
if [ str1 != str2 ]      当串str1和str2不等时为真 
if [ -n str1 ]       当串的长度大于0时为真(串非空) 
if [ -z str1 ]        当串的长度为0时为真(空串) 
if [ str1 ]         当串str1为非空时为真

!叹号。一般在shell脚本中表示取反;
[] 方括号,这个叫做条件表达式,简易版的if
-n 用于判断变量是否为空,注意只要有一个符号就不为空,空格也不行
-d directory意思用于判断目录是否存在;
[-n "str"]判断变量如果不为空则条件成立; 注意: -n 来判定字符串非空,它后面的参数不加“”时该if语句等效于if [ -n ],shell 会把它当成if [ str1 ]来处理,-n自然不为空,所以为正。
 [!-d]判断变量如果不是目录则条件成立;

三、$0,$1,$2代表的含义:
我们经常见到shell脚本中使用的$0,$1,$2,分别的意思就是:

$0:是指你所写的shell脚本本身的名字;
$1:是指你写的shell脚本所传入的第一个参数 ;
$2:是指你写的shell脚本所传入的第二个参数;

四、shell脚本中shift用法:
shift:用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理
shift(shift 1)命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。
同理,shift n后,前n位参数都会被销毁,如:输入5个参数(a b c d e),那么$1=a,$2=b,$3=c,$4=d,$5=e,执行shift 3操作后,
前3个参数a、b、c被销毁,就剩下了2个参数:d,e(这时d=$1,e=$2,其中d由$4 -> $1,e由$5 -> $2)

五、[$# ]用法
if [ $# = 0 ] ; then 是什么意思
if [ $# -eq 0 ]; then
$#表示位置参数的数目(对脚本来说,是运行脚本时所带的参数;对函数来说,是函数调用时传入的参数)。
数值的比较用 -eq ,字符串的比较才用 =
$#
这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。
这脚本的意思就是判断是否有参数,如果没有的话执行then后面的命令

实例:写个小脚本来验证二、三、四、五的用法,脚本内容:

#!/bin/bash
main()
{
 echo "xingxing0: $0"
 echo "xingxing1: $1"
 echo "xingxing2: $2"
 nihao a b c
}
function nihao()
{
 while [ $# != 0 ] ; do
       [ -n "$1" ] && echo "Download $1"; shift;
 done

}
main "$@"

运行结果:

六、sed -e 语法实例

sed 命令后面option的选项:

a 追加,向匹配行后面插入内容 
i 插入,向匹配行前插入内容
c 更改,更改匹配行的内容
d 删除,删除匹配行的内容
s 使用替换模式替换相应模式
s/patten/newstring 替换,把patten匹配到的内容换成newstring
p 打印,打印出匹配的内容,通过与-n选项配合使用

q 退出命令
= 标号,用来将匹配的行前标号
n 读取下一行,遇到n会自动自动跳入下一行
r 将内容读入文件
{} 命令间的传递,类似于管道符|
w 将匹配内容写入文件
W 将匹配到行的第一行,保存到file中。

替换字符

  • g : 表示将匹配到的内容进行全局替换 。
  • \1 :表示前面第一个左括号所表示的内容 ,\2表示前面第二个左括号中表示的内容,依次类推
  • & : 表示前面匹配到的内容

特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo\*ob 匹配字符串 runo*ob。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

特别字符    描述
$    匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( )    标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 和和。
*    匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+    匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
.    匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[    标记一个中括号表达式的开始。要匹配 [,请使用 \[。
?    匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\    将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^    匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
{    标记限定符表达式的开始。要匹配 {,请使用 \{。
|    指明两项之间的一个选择。要匹配 |,请使用 \|。

实例:

sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \

-e 's@/usr@/tools@g' $file.orig > $file

含义:将目录下的叫做linux.h, linux64.h 或者sysv4.h这3个文件找出来,对每一个文件,先拷贝成这个文件名字加上.orig后缀的文件,然后将.orig文件里的“/lib/ld”, “/lib64/ld” or “/lib32/ld”加上前缀/tools,第二个是将/usr替换成/tools。然后替换好了加上之后那些宏。并且更新orig的时间,这是为了防止两次将file拷贝成orig。第一个cp 里面有一个-u的命令,这个命令就是只有当source比dst要更加新的时候才进行拷贝;

第一个sed 语句后面的tools& 这个表示在前面的内容(/lib/ld等)前面加上/tools这个目录,而不是替换的含义,因为&在这里表示“与”的含义

@是分隔符含义:
sed -e ‘s/asdf/fdsa/g’,意思是把每一行的asdf替换成fdsa,其中/是分隔符,规定在s之后第一个符号为分隔符,当然可以是/也可以是@

特别的:

1. 斜杠/本身是作为sed语句中的分隔符,但如果需要替换的字符串里也包含斜杠/,那么可以用井号#来做分隔符(还可以用问号?)

替换MULTIARCH=$($CC --print-multiarch 2>/dev/null)为MULTIARCH="aarch64-linux-musl的命令如下:

sed -i -e 's#MULTIARCH=$($CC --print-multiarch 2>/dev/null)#MULTIARCH="aarch64-linux-musl"#g' 1.txt

未完待续!

sh脚本中一些命令使用总结及sed命令相关推荐

  1. ps -ef |grep -v 在shell sh 脚本中貌似无效?

    ps -ef |grep -v 在shell sh 脚本中貌似无效? 想通过ps -ef |grep erdp_ |awk '{print $2}' 获取 erdp_ 开头的进程id, 执行在终端环境 ...

  2. oracle视图执行脚本,Sh脚本中查询Oracle v$视图时需要在$号前加转义符“\”

    DBA经常会部署一些sh脚本登陆Oracle数据库查询v$动态视图得到一些东西来实际管理自动化的目的,但在sh脚本中写ORACLE SQL语句时,如果语句查询v$视图,直接写v$XXXX是不能成功的, ...

  3. Linux Shell - 脚本中自动确认需要输入确认的命令

    文章目录 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 2.其它命令 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 通过指定 -y ...

  4. Linux批量替换sh脚本中\r 符号

    一.脚本中出现\r的原因 该脚本在window上编辑过,widnow 上文件换行是 \r\n 而 linux上是 \n.     在Windows下换行的"\r"到了Linux环境 ...

  5. linux中 删除指定行多行sed命令

    sed命令常用到的两个选项: -i : 直接在文件上编辑 (edit files in place) -e[默认选项]:只在命令行输出,而文件不改变 (add the script to the co ...

  6. linux的sed命令是什么,linux sed命令

    linux sed命令 简介: sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令 ...

  7. Linux 命令(3)—— sed 命令

    文章目录 1.功能简介 2.命令格式 3.选项说明 4.常用示例 4.1 删除行操作 4.2 新增行操作 4.3 替换行操作 4.4 选择行打印 4.5 数据的查找并进行相关操作 4.6 多点编辑 4 ...

  8. bat脚本中获取上级目录_批处理bat命令--获取当前盘符和当前目录和上级目录

    批处理命令获取当前盘符和当前目录 %~d0 是当前盘符 %cd% 是当前目录 可以用echo %cd%进行打印测试 以下例子是命令行编译Visual Studio编写的程序: @echo off se ...

  9. bat脚本中获取上级目录_批处理bat命令 获取当前盘符和当前目录和上级目录的代码...

    批处理命令获取当前盘符和当前目录 当前盘符:%~d0 当前路径:%cd% 当前执行命令行:%0 当前bat文件路径:%~dp0 当前bat文件短路径:%~sdp0 测试 echo 当前盘符:%~d0 ...

最新文章

  1. 微信小程序实现滑动翻页效果源码附效果图
  2. 无事“自动驾驶”,有事“辅助驾驶”?
  3. storm-kafka编程指南
  4. .NET系列 之 开源和不开源的背后
  5. 搭建nginx + python + django +memcached+ mysql +fastcgi 环境
  6. LIS 最长递增子序列问题
  7. 2017年最受欢迎的15大Python库有哪些?
  8. 思考的乐趣:Matrix67数学笔记
  9. 2021Java开发工程师必备知识,Java后端学习主流知识学习系列(一)(建议先收藏)
  10. linux c如何判断字符串是否为空
  11. 数据挖掘基础知识(未完待续)
  12. COMSOL吸附模拟
  13. iOS 判断机型是否为iPhone Xs Max
  14. TongWeb卡、TongWeb卡、TongWeb卡卡卡
  15. javaFX 界面例子
  16. 刷卡分期的套路有多深?信用卡、花呗、白条没有善人
  17. .Net、C# 汉字转拼音,简体繁体转换方法
  18. 解决opencv保存视频打不开问题
  19. TFDS中检测算法的应用
  20. 中国城市资本流动问题探索(Python)

热门文章

  1. VM虚拟机系统自定义分区
  2. 关于软件测试的MySQL基础
  3. 从零开始学Circos绘制圈图(一)
  4. 动态交通信息“心”服务
  5. 欧姆龙SysmacStudio 关于模块化编程的使用技巧---全局变量和数据类型
  6. C:\Users\Admin\AppData\Roaming\npm-cache\_logs\2019-06-06T01_10_38_076Z-debug.log踩坑记
  7. 【迁移学习】猫狗数据分类案例(TensorFlow2)
  8. appium 环境搭建配置清单带版本号
  9. 云密码技术--北京商密协会《云密码服务技术白皮书2019》
  10. vue2安装axios基本配置