热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux循环符号,玩转shell编程中的符号

玩转shell符号在shell脚本编程中常用的特殊符号如下:#;;;.,\\string|!$${}$?$$$*\string\***?:^$#$command{

玩转shell符号

在shell脚本编程中常用的特殊符号 如下:

# ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $*

\"string\"* **   ? : ^ $#   $@ `command`{}   [] [[]] ()   (())

||   && {xx,yy,zz,...}~   ~&#43;   ~-   &   \\<...>   &#43; - %&#61;   &#61;&#61;   !&#61;

# 井号 (comments)

这几乎是个满场都有的符号&#xff0c;除了先前已经提过的\"第一行\"

#!/bin/bash

井号也常出现在一行的开头&#xff0c;或者位于完整指令之后&#xff0c;这类情况表示符号后面的是注解文字&#xff0c;不会被执行。

# This line is comments.

echo \"a &#61; $a\" # a &#61; 0

由于这个特性&#xff0c;当临时不想执行某行指令时&#xff0c;只需在该行开头加上 # 就行了。这常用在撰写过程中。

#echo \"a &#61; $a\" # a &#61; 0

如果被用在指令中&#xff0c;或者引号双引号括住的话&#xff0c;或者在倒斜线的后面&#xff0c;那他就变成一般符号&#xff0c;不具上述的特殊功能。

~ 帐户的 home 目录

算是个常见的符号&#xff0c;代表使用者的 home 目录&#xff1a;cd ~&#xff1b;也可以直接在符号后加上某帐户的名称&#xff1a;cd ~user或者当成是路径的一部份&#xff1a;~/bin

~&#43; 当前的工作目录&#xff0c;这个符号代表当前的工作目录&#xff0c;她和内建指令 pwd的作用是相同的。

# echo ~&#43;/var/log

~- 上次的工作目录&#xff0c;这个符号代表上次的工作目录。

# echo ~-/etc/httpd/logs

; 分号 (Command separator)

在 shell 中&#xff0c;担任\"连续指令\"功能的符号就是\"分号\"。譬如以下的例子&#xff1a;cd ~/backup ; mkdir startup ;cp ~/.* startup/.

;; 连续分号 (Terminator)

专用在 case 的选项&#xff0c;担任 Terminator 的角色。

case \"$fop\" inhelp) echo \"Usage: Command -help -version filename\";;version) echo \"version 0.1\" ;;esac

. 逗号 (dot,就是“点”)

在 shell 中&#xff0c;使用者应该都清楚&#xff0c;一个 dot 代表当前目录&#xff0c;两个 dot 代表上层目录。

CDPATH&#61;.:~:/home:/home/web:/var:/usr/local

在上行 CDPATH 的设定中&#xff0c;等号后的 dot 代表的就是当前目录的意思。

如果档案名称以 dot 开头&#xff0c;该档案就属特殊档案&#xff0c;用 ls 指令必须加上 -a 选项才会显示。除此之外&#xff0c;在 regularexpression 中&#xff0c;一个 dot 代表匹配一个字元。

&#39;string&#39; 单引号 (single quote)

被单引号用括住的内容&#xff0c;将被视为单一字串。在引号内的代表变数的$符号&#xff0c;没有作用&#xff0c;也就是说&#xff0c;他被视为一般符号处理&#xff0c;防止任何变量替换。

heyyou&#61;homeecho &#39;$heyyou&#39; # We get $heyyou

\"string\" 双引号 (double quote)

被双引号用括住的内容&#xff0c;将被视为单一字串。它防止通配符扩展&#xff0c;但允许变量扩展。这点与单引数的处理方式不同。

heyyou&#61;homeecho \"$heyyou\" # We get home

&#96;command&#96; 倒引号 (backticks)

在前面的单双引号&#xff0c;括住的是字串&#xff0c;但如果该字串是一列命令列&#xff0c;会怎样&#xff1f;答案是不会执行。要处理这种情况&#xff0c;我们得用倒单引号来做。

fdv&#61;&#96;date &#43;%F&#96;echo \"Today $fdv\"

在倒引号内的 date &#43;%F 会被视为指令&#xff0c;执行的结果会带入 fdv 变数中。

, 逗点 (comma&#xff0c;标点中的逗号)

这个符号常运用在运算当中当做\"区隔\"用途。如下例

#!/bin/bashlet \"t1 &#61; ((a &#61; 5 &#43; 3, b &#61; 7 - 1, c &#61; 15 / 3))\"echo \"t1&#61; $t1, a &#61; $a, b &#61; $b\"

/ 斜线 (forward slash)

在路径表示时&#xff0c;代表目录。

cd /etc/rc.dcd ../..cd /

通常单一的 / 代表 root 根目录的意思&#xff1b;在四则运算中&#xff0c;代表除法的符号。

let \"num1 &#61; ((a &#61; 10 / 2, b &#61; 25 / 5))\"

\\ 倒斜线

在交互模式下的escape 字元&#xff0c;有几个作用&#xff1b;放在指令前&#xff0c;有取消 aliases的作用&#xff1b;放在特殊符号前&#xff0c;则该特殊符号的作用消失&#xff1b;放在指令的最末端&#xff0c;表示指令连接下一行。

# type rmrm is aliased to &#96;rm -i&#39;# \\rm ./*.log

上例&#xff0c;我在 rm 指令前加上 escape 字元&#xff0c;作用是暂时取消别名的功能&#xff0c;将 rm 指令还原。

# bkdir&#61;/home# echo \"Backup dir, \\$bkdir &#61; $bkdir\"Backup dir,$bkdir &#61; /home

上例 echo 内的 \\$bkdir&#xff0c;escape 将 $ 变数的功能取消了&#xff0c;因此&#xff0c;会输出 $bkdir&#xff0c;而第二个 $bkdir则会输出变数的内容 /home。

| 管道 (pipeline)

pipeline 是 UNIX 系统&#xff0c;基础且重要的观念。连结上个指令的标准输出&#xff0c;做为下个指令的标准输入。

who | wc -l

善用这个观念&#xff0c;对精简 script 有相当的帮助。

! 惊叹号(negate or reverse)

通常它代表反逻辑的作用&#xff0c;譬如条件侦测中&#xff0c;用 !&#61; 来代表\"不等于\"

if [ \"$?\" !&#61; 0 ]thenecho \"Executes error\"exit 1fi

在规则表达式中她担任 \"反逻辑\" 的角色

ls a[!0-9]

上例&#xff0c;代表显示除了a0, a1 .... a9 这几个文件的其他文件。

: 冒号

在 bash 中&#xff0c;这是一个内建指令&#xff1a;\"什么事都不干\"&#xff0c;但返回状态值 0。

:

echo $? # 回应为 0

: > f.$$

上面这一行&#xff0c;相当于 cat /dev/null >f.$$。不仅写法简短了&#xff0c;而且执行效率也好上许多。

有时&#xff0c;也会出现以下这类的用法

: ${HOSTNAME?} ${USER?} ${MAIL?}

这行的作用是&#xff0c;检查这些环境变数是否已设置&#xff0c;没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if这类的做法&#xff0c;基本上也可以处理&#xff0c;但都比不上上例的简洁与效率。

? 问号 (wild card)

在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元&#xff0c;但不包含 null 字元。

# ls a?a1

善用她的特点&#xff0c;可以做比较精确的档名匹配。

* 星号 (wild card)

相当常用的符号。在文件名扩展(Filename expansion)上&#xff0c;她用来代表任何字元&#xff0c;包含 null 字元。

# ls a*a a1 access_log

在运算时&#xff0c;它则代表 \"乘法\"。

let \"fmult&#61;2*3\"

除了内建指令 let&#xff0c;还有一个关于运算的指令expr&#xff0c;星号在这里也担任\"乘法\"的角色。不过在使用上得小心&#xff0c;他的前面必须加上escape 字元。

** 次方运算

两个星号在运算时代表 \"次方\" 的意思。

let \"sus&#61;2**3\"echo \"sus &#61; $sus\" # sus &#61; 8

$ 钱号(dollar sign)

变量替换(Variable Substitution)的代表符号。

vrs&#61;123echo \"vrs &#61; $vrs\" # vrs &#61; 123

另外&#xff0c;在 Regular Expressions 里被定义为 \"行\" 的最末端 (end-of-line)。这个常用在grep、sed、awk 以及 vim(vi) 当中。

${} 变量的正规表达式

bash 对 ${} 定义了不少用法。以下是取自线上说明的表列

${parameter:-word}   ${parameter:&#61;word}   ${parameter:?word}   ${parameter:&#43;word}   ${parameterffset}   ${parameterffset:length}   ${!prefix*}   ${#parameter}   ${parameter#word}   ${parameter##word}   ${parameter%word}   ${parameter%%word}   ${parameter/pattern/string}   ${parameter//pattern/string}

$*

$* 引用script的执行引用变量&#xff0c;引用参数的算法与一般指令相同&#xff0c;指令本身为0&#xff0c;其后为1&#xff0c;然后依此类推。引用变量的代表方式如下&#xff1a;

$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}.....

个位数的&#xff0c;可直接使用数字&#xff0c;但两位数以上&#xff0c;则必须使用 {} 符号来括住。

$* 则是代表所有引用变量的符号。使用时&#xff0c;得视情况加上双引号。

echo \"$*\"

还有一个与 $* 具有相同作用的符号&#xff0c;但效用与处理方式略为不同的符号。

$&#64;

$&#64; 与 $* 具有相同作用的符号&#xff0c;不过她们两者有一个不同点。

符号 $* 将所有的引用变量视为一个整体。但符号 $&#64; 则仍旧保留每个引用变量的区段观念。

$#

这也是与引用变量相关的符号&#xff0c;她的作用是告诉你&#xff0c;引用变量的总数量是多少。

echo \"$#\"

$? 状态值 (status variable)

一般来说&#xff0c;UNIX(linux) 系统的进程以执行系统调用exit()来结束的。这个回传值就是status值。回传给父进程&#xff0c;用来检查子进程的执行状态。

一般指令程序倘若执行成功&#xff0c;其回传值为 0&#xff1b;失败为 1。

tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho\"$?\"$$

由于进程的ID是唯一的&#xff0c;所以在同一个时间&#xff0c;不可能有重复性的 PID。有时&#xff0c;script会需要产生临时文件&#xff0c;用来存放必要的资料。而此script亦有可能在同一时间被使用者们使用。在这种情况下&#xff0c;固定文件名在写法上就显的不可靠。唯有产生动态文件名&#xff0c;才能符合需要。符号$$或许可以符合这种需求。它代表当前shell 的 PID。

echo \"$HOSTNAME, $USER, $MAIL\" > ftmp.$$

使用它来作为文件名的一部份&#xff0c;可以避免在同一时间&#xff0c;产生相同文件名的覆盖现象。

ps: 基本上&#xff0c;系统会回收执行完毕的 PID&#xff0c;然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法&#xff0c;如果script 执行完毕后仍不加以清除&#xff0c;会产生其他问题。

(   ) 指令群组 (command group)

用括号将一串连续指令括起来&#xff0c;这种用法对 shell 来说&#xff0c;称为指令群组。如下面的例子&#xff1a;(cd ~ ; vcgh&#61;&#96;pwd&#96; ;echo $vcgh)&#xff0c;指令群组有一个特性&#xff0c;shell会以产生 subshell来执行这组指令。因此&#xff0c;在其中所定义的变数&#xff0c;仅作用于指令群组本身。我们来看个例子

# cat ftmp-01#!/bin/basha&#61;fsh(a&#61;incg ; echo -e \"\\n $a \\n\")echo $a#./ftmp-01incgfsh

除了上述的指令群组&#xff0c;括号也用在 array 变数的定义上&#xff1b;另外也应用在其他可能需要加上escape字元才能使用的场合&#xff0c;如运算式。

(( ))

这组符号的作用与 let 指令相似&#xff0c;用在算数运算上&#xff0c;是 bash 的内建功能。所以&#xff0c;在执行效率上会比使用 let指令要好许多。

#!/bin/bash(( a &#61; 10 ))echo -e \"inital value, a &#61; $a\\n\"(( a&#43;&#43;))echo \"after a&#43;&#43;, a &#61; $a\"

{ } 大括号 (Block of code)

有时候 script 当中会出现&#xff0c;大括号中会夹着一段或几段以\"分号\"做结尾的指令或变数设定。

# cat ftmp-02#!/bin/basha&#61;fsh{a&#61;inbc ; echo -e \"\\n $a \\n\"}echo $a#./ftmp-02inbcinbc

这种用法与上面介绍的指令群组非常相似&#xff0c;但有个不同点&#xff0c;它在当前的 shell 执行&#xff0c;不会产生 subshell。

大括号也被运用在 \"函数\" 的功能上。广义地说&#xff0c;单纯只使用大括号时&#xff0c;作用就像是个没有指定名称的函数一般。因此&#xff0c;这样写 script也是相当好的一件事。尤其对输出输入的重导向上&#xff0c;这个做法可精简 script 的复杂度。

此外&#xff0c;大括号还有另一种用法&#xff0c;如下

{xx,yy,zz,...}

这种大括号的组合&#xff0c;常用在字串的组合上&#xff0c;来看个例子

mkdir {userA,userB,userC}-{home,bin,data}

我们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data&#xff0c;这几个目录。这组符号在适用性上相当广泛。能加以善用的话&#xff0c;回报是精简与效率。像下面的例子

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}



推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 进入配置文件目录:[rootlinuxidcresin-4.0.]#cdusrlocalresinconf查看都有哪些配置文件:[rootlinuxid ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 从U ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • top命令使用方法及解读
    本文介绍了top命令的使用方法和解读,包括查看进程信息、系统负载、内存状态、CPU占用等内容。通过top命令可以持续观察系统上运行的进程,并了解系统负载情况,及时关闭一些进程以减轻系统负担。同时,还介绍了top命令的快捷键和安全模式启动方法。通过本文的学习,读者可以更好地使用top命令来管理系统进程。 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
author-avatar
NANA-LS
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有