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

sh脚本中一些命令使用总结及sed命令shell 脚本中一些语法使用方法总结 shsed

大家好,欢迎来到IT知识分享网。

一、shell命令-pushd和popd

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

dirs 、pushd、popd

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

pushd: 把目录放入栈中

popd: 把目录从栈中移除

pushd用法:

popd用法:

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

实操:

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

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

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

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

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

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

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

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

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

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

二、[-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为非空时为真





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

四、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后面的命令






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

运行结果:

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

六、sed -e 语法实例

sed 命令后面option的选项:

替换字符

  • 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这个目录,而不是替换的含义,因为&在这里表示“与”的含义

特别的:

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

未完待续!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/133813.html

(0)
上一篇 2025-07-17 18:15
下一篇 2025-07-17 18:20

相关推荐

发表回复

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

关注微信