linux shell

2023-05-16

转自:http://blog.csdn.net/fly_sky520/article/details/8853537

最近在linux下面编写shell脚本,差不多是边学边写。在此记录一些学习心得。

一)shell的引号。

shell的引号有单引号',双引号",反引号`。

由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。

由双引号括起来的字符,除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号表示命令替换;仅当“\”后面的字符是下述字符之一时,“\”才是转义字符,这些字符是:“$”、“`”、“"”、“\”或换行符。转义字符告诉Shell不要对其后面的那个字符进行特殊处理,只是当作普通字符。

倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。

二)目录权限。

文件或目录的访问权限分为只读(r),只写(w)和可执行(x)三种。

当我们用ls -l命令的时候,会看到如下内容


其中第一列我们看到了-rw-r--r--的字符,这个就表示当前的文件的权限。

横线代表空许可。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是个文件。如果第一个字符是横线,表示是个非目录的文件。如果是d,表示是个目录。除第一个位置外,剩下的每连续三个表示一个权限,第一个连续三字符表示文件拥有者的权限,比如这里的”rw-“表示文件拥有着具有可读可写的权限。第二个连续三字符”r--“表示文件拥有着所在组具有的权限,这里的”r--“表示只读。后面连续三字符表示所有用户的权限,也是只读。

在权限设置中,我们为了简化这种权限设置,通常把r、w、x分别用4、2、1表示,然后把它们相加表示文件的权限。比如上面的两个文件的权限就是644。又比如一个文件的权限是754,那就表示文件的拥有者具有可读可写可执行的权限,所在组具有读和执行的权限,其他用户具有读的权限。

我们可以通过chmod来修改一个文件的权限。这里有两种方式,首先是数字设定法,我们只需要运行下面的命令


或者使用文字设定法,如下


文字设定法中的u+x,g-w-r,o-x-r就表示设定权限,其中u,g,o分别表示文件拥有者,所在组用户,其他用户,而+,-对应增加与删除权限。

当然使用chmod修改文件权限只能是超级用户和文件的拥有者。

除此之外,我们还能用户chgrp修改文件所属组,chown修改文件所属用户或组。

语法:chgrp [选项] 用户组 文件

语法:chown [选项] 用户或组 文件


三)变量。

shell中的变量不需要声明,赋值的话直接[变量名=值]就可以了。比如

[plain]  view plain copy
  1. num=1  
  2. me=fly  

在shell中变量引用有几个需要注意的地方,比如你在脚本中使用下面的语句时

[plain]  view plain copy
  1. echo "I'm ${me}Baby"  
这时候就不能直接使用$meBaby,因为shell解释的时候就会去找meBaby这个变量。而你只有me这个变量。

在shell中实现变量的运算时,需要注意几个地方,看下图的执行结果


从上面的执行结果我们可以看出,使用shell变量就行运算的时候,可以使用中括号,双小括号,以及expr运算关键字。

除了以上基本的变量外,shell里面还有一些特殊的参数。如下面的参数:

[plain]  view plain copy
  1.  $0 = shell名称或shell脚本名称 $1 = 第一个shell参数 ...   
  2.  $9 = 第九个shell参数 $# = 位置参数的个数   
  3.  "$*" = "$1 $2 $3 $4 .. $n",以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个。  
  4.  "$@" = "$1" "$2" "$3" "$4" .. "$n",与$#相同,但是使用时加引号,并在引号中返回每个参数。  
  5.  $# 传递到脚本的参数个数。  
  6.  $- 显示shell使用的当前选项,与set命令功能相同。  
  7.  $? = 最近执行的命令的退出状态,0表示没有错误,其他任何值表明有错误。  
  8.  $$ = 当前shell脚本的PID。  
  9.  $! = 最近启动的后台作业的PID。   
  10.   形式           如果设置了var   如果没设置var   
  11.  ${var:-string}     $var            string   
  12.  ${var:+string}     string          null   
  13.  ${var:=string}     $var            string (并执行var = string)   
  14.  ${var:?string}     $var            返回string然后退出   
  15.   形式               结果   
  16.  ${var%suffix}     删除位于var结尾的最小匹配模式   
  17.  ${var%%suffix}    删除位于var结尾的最大匹配模式   
  18.  ${var#suffix}     删除位于var开头的最小匹配模式   
  19.  ${var##suffix}    删除位于var开头的最大匹配模式  

四)条件与循环。

跟其他编程语言一样,shell中包含if条件语句,while,for,until循环,以及case和select语句。首先介绍if条件语句

if语句结构[if/then/elif/else/fi],其中[ ]与变量之间有空格。

[plain]  view plain copy
  1. if [ $y -eq 1 ];then  
  2. <span style="white-space:pre">  </span>y=$(($y+1))  
  3. else  
  4. <span style="white-space:pre">  </span>y=1  
  5. fi  
shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割。

[plain]  view plain copy
  1. num=3;if [ $num -eq 1 ] ;then echo 1; elif [ $num -eq 2 ] ;then echo 2;else echo 3;fi;  
在if条件语句中,可以对数字字符串进行大小,匹配比较,还可以对文件夹、文件的权限、存在与否进行判断。

五)函数。

六)时间。

七)grep,sed,awk,tr等工具的使用。

我们从例子入手,下面有一个文件f中的域名取出并排序,内容如下,

[plain]  view plain copy
  1. http://www.fly_sky520.org/index.html  
  2.   
  3. http://www.fly_sky520.org/1.html  
  4.   
  5. http://post.fly_sky520.org/index.html  
  6.   
  7. http://mp3.fly_sky520.org/index.html  
  8.   
  9. http://www.fly_sky520.org/3.html  
  10.   
  11. http://post.fly_sky520.org/2.html  
*注意,各行之间有空行。下面看我的操作

1)首先利用grep与awk工具。

该方法先利用grep -v 取非空行数据,-v参数是反向检索的意思。效果如下:


然后利用awk工具取以"/"分隔符分割的第三个参数,也就是域名了。


最后利用sort进行排序,用nuiq -c计数


所以第一个完整命令就是

[plain]  view plain copy
  1. cat f | grep -v '^$'|awk -F/ '{print $3}'|sort|uniq -c  

2)利用tr与grep工具

首先利用tr工具的替换功能


再利用grep工具查找包含域名的项


最后排序计数


所以完整命令就是

[plain]  view plain copy
  1. cat f |tr "\/" "\n" | grep fly | sort | uniq -c  


3)利用cut与tr工具

首先使用cut工具取出域名

cut -d/ -f3的意思就是把文件内容以“/”作为分隔符,并去取出第三部分显示。-d就是自定义分隔符的意思,默认分隔符为制表符,-f就是显示区域

然后,我们再利用tr工具去除空行


最后排序计数


所以最后的方法为

[plain]  view plain copy
  1. cut -d/ -f3 f|tr -s '\n'|sort | uniq -c  

4)利用sed工具

首先利用sed工具去除空行


sed命令中d为删除的意思。//之间为正则表达式^$表示空行。然后再利用sed的‘s///g’字符替换功能


最后还是排序计数



sed的编辑功能相当强大,比如我要修改配置文件f中【name  = “Fly” 】的name为Sky。我只需要输入以下命令


其中-i就是直接修改文件内容的选项,这个命令的操作就是通过/name/先查找出name行,然后修改对应的值。

下面是一些sed的例子

[plain]  view plain copy
  1. 6. 实例    
  2. 删除:d命令    
  3. $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。    
  4. $ sed '$d' example-----删除example文件的最后一行。   
  5. 替换:s命令  
  6. $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。    
  7. $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。  
  8. $ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。   
  9. $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。    
  10. 选定行的范围:逗号  
  11. $ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。   
  12. $ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。  
  13. $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。    
  14. 多点编辑:e命令    
  15. $ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。    
  16. $ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。    
  17. 从文件读入:r命令   
  18. $ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。    
  19. 写入文件:w命令   
  20. $ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。    
  21. 追加命令:a命令   
  22. $ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。    
  23. 插入:i命令    
  24. $ sed '/test/i\\    
  25. new line    
  26. -------------------------' example    
  27. 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。    
  28. 下一个:n命令    
  29. $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。    
  30. 变形:y命令    
  31. $ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。    
  32. 退出:q命令    
  33. $ sed '10q' example-----打印完第10行后,退出sed。    
  34. 保持和获取:h命令和G命令  
  35. $ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。    
  36. 保持和互换:h命令和x命令    
  37. $ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。    
以上实例内容摘自网友icyheart的帖子,地址是http://www.iteye.com/topic/587673。

八)定时任务。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux shell 的相关文章

  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 如何设置 tmux 在启动时打开指定的窗口?

    如何设置 tmux 使其在启动时打开指定的窗口 您可以编写一个小 shell 脚本来启动 tmux 以及所需的程序 我在一个名为 dev tmux 的 shell 脚本中包含以下内容 开发环境 bin sh tmux new session
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交

随机推荐