sh脚本中一些命令使用总结及sed命令

一、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.hlinux64.h 或者sysv4.h3个文件找出来,对每一个文件,先拷贝成这个文件名字加上.orig后缀的文件,然后将.orig文件里的“/lib/ld, “/lib64/ld” or “/lib32/ld加上前缀/tools,第二个是将/usr替换成/tools。然后替换好了加上之后那些宏。并且更新orig的时间,这是为了防止两次将file拷贝成orig。第一个cp 里面有一个-u的命令,这个命令就是只有当sourcedst要更加新的时候才进行拷贝;

第一个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

未完待续!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值