Linux Shell编程(4)——shell特殊字符(上)
#
注释. 以一个#开头的行 (#!是例外) 是注释行.
# 这是一行注释.
注释也可以出现在一个命令语句的后面。
echo "A comment will follow." # 这里可以添加注释.
# ^ 注意在#前面可以有空白符 #
注释行前面也可以有空白字符.
#注意这个注释行的开头是一个TAB键.
在同一行中,命令不会跟在一个注释的后面。因为这种情况下没有办法分辨注释的结尾,命令只能放在同一行的行首。用另外的一个新行开始下一个注释。
当然了,在echo命令给出的一个转义的#字符并不会开始一个注释。同样地,出现在一些参数代换结构和在数值常量表达式中的#字符也同样不会开始一个注释。
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # here begins a comment.
echo ${PATH#*:} # 前面的#是参数代换,不是注释.
echo $(( 2#101011 )) # 基本转换,不是注释.
# 多谢, S.C.
标准的引用和转义 符("'\)可以转义#。
当然,模式匹配操作也可以使用#,而不必把它当做注释的开始。
;
命令分割符[分号]. 分割符允许在同一行里有两个或更多的命令.
echo hello; echo there
if [ -x "$filename" ]; then # 注意:"if" and "then"需要分隔符
# 思考一下这是为什么?
echo "File $filename exists."; cp $filename $filename.bak
else
echo "File $filename not found."; touch $filename
fi; echo "File test complete."
注意”;”有时需要转义.
;;
case语句分支的结束符[双分号].
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac
.
"点"命令[圆点]. 等同于source (参考例子 11-20).这是一个bash的内建命令.
.
"点", 作为一个文件名的组成部分.当点(.)以一个文件名为前缀时,起作用使该文件变成了隐藏文件。这种隐藏文件ls一般是不会显示出来的。[译者注:除非你加了选项-a]
bash$ touch .hidden-file
作为目录名时,单个点(.)表示当前目录,两个点(..)表示上一级目录(译者注:或称为父目录)。
bash$ pwd
/home/bozo/projects
bash$ cd .
bash$ pwd
/home/bozo/projects
bash$ cd ..
bash$ pwd
/home/bozo/
单点(.)文件名常常被当作文件移动命令的目的路径.
bash$ cp /home/bozo/current_work/junk/* .
.
点(.)字符匹配.作为正则表达式的一部分,匹配字符时,单点(.)表示匹配任意一个字符。
"
部分引用[双引号]. "STRING"的引用会使STRING里的特殊字符能够被解释。请参考第五章.
'
完全引用[单引号]. 'STRING'能引用STRING里的所有字符(包括特殊字符也会被原样引用). 这是一个比使用双引号(“)更强的引用。 参考第5章.
,
逗号操作符[逗号]. 逗号操作符用于连接一连串的数学表达式。这一串的数学表达式每一个都被求值,但只有最后一个被返回。(译者注:换句话说,就是整个表达式的值取决于最后一个表达式的值。)
1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3"
\
转义符[后斜杠].用于单个字符的引用机制。
\X "转义"字符为X.它有"引用"X的作用,也等同于直接在单引号里的'X'.\符也可以用于引用双引号(")和单引号('),这时双引号和单引号就表示普通的字符,而不是表示引用了。
参考第五章对转义字符的更深入的解释。
/
文件路径的分隔符[前斜杠]. 分隔一个文件路径的各个部分。(就像/home/bozo/projects/Makefile).
它也是算术操作符中的除法.
`
命令替换.`command` 结构使字符(`)[译者注:这个字符不是单引号,而是在标准美国键盘上的ESC键下面,在字符1左边,在TAB键上面的那个键,要特别留心]引住的命令(command)执行结果能赋值给一个变量。它也被称为后引号(backquotes)或是斜引号(backticks).
:
空命令[冒号]. 这个命令意思是空操作(即什么操作也不做). 它一般被认为是和shell的内建命令true是一样的。冒号":" 命令是Bash自身内建的, and its它的退出状态码是真(即0)。[译者注:shell中真用数字0表示].
:
echo $? # 0
死循环可以这么写:
while :
do
operation-1
operation-2
...
operation-n
done
# 等同于:
# while true
# do
# ...
# done
在if/then的测试结构中用作占位符:
if condition
then : # 什么也不做的分支
else
take-some-action
fi
在必须要有两元操作的地方作为一个分隔符, 参考例子 8-2和默认参数.
: ${username=`whoami`}
# ${username=`whoami`} 如果没有开头的:,将会出错
# 除非"username"是一个外部命令或是内建命令...
在here document中的一个命令作为一个分隔符.
在参数替换中为字符串变量赋值
: ${HOSTNAME?} ${USER?} ${MAIL?}
# 如果列出的一个或多个基本的环境变量没有设置,
#+ 将打印出错信息。
变量扩展/子串代换.
和重定向操作符(>)连用, 可以把一个文件的长度截短为零,文件的权限不变。如果文件不存在,则会创建一个新文件。
: > data.xxx # 文件"data.xxx"现在长度为0了
# 作用相同于:cat /dev/null >data.xxx(译者注:echo >data.xxx也可以)
# 但是,用NULL(:)操作符不会产生一个新的进程,因为NULL操作符是内建的。
请参考例子 12-14.
和添加重定向操作符(>>)连用(: >> target_file).如果目标文件存在则什么也没有发生,如果目标文件不存在,则创建它。
这只能应用在普通文件中,不能用在管道,符号链接和其他的特殊文件。
虽然这是不被推荐的,但是NULL操作符(:)也可以用于开始注释一行。使用#来注释一行将会使Bash不会检查这行后面的语法是否有错,因此#注释几乎可以出现任何的东西。但是,对于用NULL操作符(:)注释的行则不是这样。
下面一个会产生错误的注释。
1 : This is a comment that generates an error, ( if [ $x -eq 3] ).
字符”:”也用于域分割符。比如说在/etc/passwd和环境变量$PATH里.
bash$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
!
取反一个测试结果或退出状态[感叹号]. 取反操作符(!)取反一个命令的退出状态。它也取反一个测试操作。例如,它能改相等符( = )为不等符( != ).取反操作符(!)是一个Bash的关键字.
在不同的环境里,感叹号也可以出现在间接变量引用.
还有一种环境里,在命令行中,感叹号(!)调用属于历史命令机制的调用(详细请看附录 J).值得一提的是,在一个脚本里,命令历史机制是被禁止的。
*
通配符[星号].星号(*)字符在用于匹配文件名扩展的一个通配符.它自动匹配给定的目录下的每一个文件。
bash$ echo *
abs-book.sgml add-drive.sh agram.sh alias.sh
星号(*)也用于正则表达式中匹配任意数字字符。.
*
算术操作符. 在计算时,星号(*)表示乘法运算符。两个星号(**)表示求幂运算符。
?
测试操作符.在一些表达式中,问号(?)表示一个条件测试.
在双括号结构里,问号(?)表示C风格的三元操作符.请参考例子 9-30.
在参数替换表达式里,问号(?)测试一个变量是否被设置了值.
?
通配符. 字符?被用于文件名扩展特性的文件名表达式的单字符匹配,同时也在扩展正则表达式中匹配任意一个字符.
$
变量替换 (引用一个变量的内容).
var1=5
var2=23skidoo
echo $var1 # 5
echo $var2 # 23skidoo
一个变量名前面加一个$字符前缀表示引用该变量的内容。
$
行的结尾. 在正则表达式里,一个$字符表示匹配一行的结尾。
${}
参数替换.
$*, $@
位置参数.
$?
保存退出码值的变量. 变量$?保存了一个命令,一个函数,或一个脚本的退出状态码的值。
$$
进程ID变量. 变量$$保存了脚本运行时的进程ID值。
()
命令组.
1 (a=hello; echo $a)
一组由圆括号括起来的命令是新开一个子shell来执行的.
因为是在子shell里执行,在圆括号里的变量不能被脚本的其他部分访问。因为父进程(即脚本进程)不能存取子进程(即子shell)创建的变量。
a=123
( a=321; )
echo "a = $a" # a = 123
# 在圆括号里的变量"a"实际上是一个局部变量,作用局域只是在圆括号内用于数组始初化
数组初始化.
Array=(element1 element2 element3)
{xxx,yyy,zzz,...}
扩展支持.
cat {file1,file2,file3} > combined_file
# 连接file1,file2,和file3的内容并写到文件combined_file里去.
cp file22.{txt,backup}
# 拷贝"file22.txt"内容为"file22.backup"
一个命令可以在文件名扩展中从逗号分隔的各模式来扩展参数列表。 [1] 文件名将会依照列表中逗号分隔开的模式匹配扩展。
转载于:https://www.cnblogs.com/new0801/p/6176876.html
Linux Shell编程(4)——shell特殊字符(上)相关推荐
- Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向
最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! Shell 函数 1. 自定义函数 linux she ...
- Shell编程基础---shell的结构、执行及变量
2019独角兽企业重金招聘Python工程师标准>>> 本文索引: shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量 shell脚本介绍 she ...
- shell编程(八) : [shell基础] 处理用户输入
接上一篇文章shell编程(七) : [shell基础] 使用结构化命令 目录 3.3 处理用户输入 3.3.1 命令行参数 1.位置参数 2.对参数进行测试 3.3.2 特殊参数变量 1.参数个数 ...
- shell编程-初始shell及变量
shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...
- Shell编程入门-Shell程序设计实例
Shell编程入门-Shell程序设计实例 1.增加用户账户 编写一个Shell程序addaccount.sh,在系统中增加四个账户,同时设定他们的初始密码为123456,主组群为wl20. ①查看系 ...
- SHELL编程——初识SHELL编程
一.什么是SHELL编程? Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序.Shell通过提示您输入,向操作系统解释该输出,然后处理来自操作系统的任何 ...
- Linux:shell编程(shell基本语法)
参考菜鸟教程:shell教程 目录 什么是shell? shell脚本的执行方式 一.HelloWorld 二.shell中的变量 2.1.定义变量 2.1.1.定义动态变量 2.1.2.删除变量 2 ...
- linux脚本编程有参函数,shell脚本编程进阶:函数
一.函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程: 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一 ...
- linux系列(七):shell编程、shell概念、ssh协议概念、执行shell文件的三种方式
1 概念 https://www.xshell.com/zh/free-for-home-school/ 1.1 xshell(执行linux命令的客户端软件) Xshell [1] 是一个强大的安全 ...
- linux编写运行shell程序,Linux的Shell编程运行Shell程序的方法有哪些呢?
用户可以用任何编辑程序来编写Shell程序.因为Shell程序是解释执行的,所以不需要编译成目的程序.按照Shell编程的惯例,以 bash为例,程序的第一行一般为"#!/bin/bash& ...
最新文章
- java getattribute intvalue_Java NodeTree.getAttributeI方法代码示例
- Sql server 获得某一部门下的所有子部门。根据子部门获得它的上级部门。
- (二)GitHub的使用随记
- Spring Boot错误errMsg: request:ok
- 我的世界服务器玩家在线时间,将公布上线时间?我的世界中国版网易520前瞻
- 三分钟掌握Go mod常用与高级操作
- 【统计分析】4 空间点数据分析与ArcGIS
- php mysql pod_php – 连接到同一pod中的MySQL容器
- Landsat5数据下载中国地区1990年
- [Storage]RPM series linux rescan disk / RPM系Linux重新扫描硬盘
- 【Numpy】numpy.kron 用法详解
- Windows“控制面板”在哪?win10怎么打开控制面板(快捷方法)打开控制面板的多种方法都在这里
- csapp lab3 attack 《深入理解计算机系统》实验3攻击超详细0基础解析
- AES 对称加密算法
- Stepper Motor > 步进电机控制相关参数缩写
- DirectShow 简介
- 【课程作业|图论】第一章课后习题
- libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。
- 开源像素贴图_Google值得信赖的硬件计划是开源,像素精确的邮政编码以及更多开源新闻...
- maker mv rpg 源码_RPGMAKERMV入门教程(个性化游戏篇)