Bash-Special Characters

特殊字符在bash shell中的应用非常的广泛,一直没有系统的整理过相关的知识,最近系统学习了一下,还是自己英文阅读能力不够,所以这边的学习材料不是man bash,是《Advanced-Bash-Scripting-Guide》的中文译本,羡慕英文学的很不错的,在学习的时候还是阅读外文原文不会出现理解偏差,不过我是实用主义者,能用就行,不纠结,需要优化的时候再深入吧,下面开始吧。

【#】

注释符号,除开头的#!符号外,其余写在开头都是注释,#还能写在执行语句后面进行注释,写在语句后面的时候需要空格隔开,这里需要注意的是bash仅支持单行注释,没有符号可以结束注释,所以在写新的执行语句的时候,必须另起一行,在语句中写#的时候,如果被包含在'' ""引用符和\转义符中的时候认为就是#字符,没有注释的含义,还有一些其他的用法,在变量扩展中的替换和进制转换等。

### Option: SourceIP
#       Source IP address for outgoing connections.
#
# Mandatory: no
# Default:
SourceIP=192.168.100.100 ##zabbix-server的ip

grep -E "^#" /etc/zabbix/zabbix_server.conf #筛选出zabbix-server配置文件中#开头的行
sed -e '/^#/d' -e '/^$/d' /etc/zabbix/zabbix_server.conf ##删除配置文件中#开头的行和空行

echo ${PATH}
> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo ${PATH#*:}
> /usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo ${PATH##*:}
> /root/bin

echo $((2#101011))
> 43

【;】

分号是命令分隔符,允许在同一行内放置两条或者更多的命令,我就喜欢直接在命令行中输入一些循环判断语句,减少脚本文件的时候

for i in *;do echo $i;done
> anaconda-ks.cfg
> zabbix-server

A=a;B=b;C=c;echo $A $B $C | while read varA varB varC;do echo $varC $varB $varA;done
> c b a
A=1;B=2;if [ $A -gt $B ];then echo $A是较大值;else echo $B是较大值;fi
> 2是较大值

【;;】【;;&】【;&】

case条件语句终止符号,;;&和;&是bash4+版本中的终止符

A=1
case $A in 
  "1")
     echo $A ;;
  "2")
     echo $A ;;
esac

【.】

句点符号.等价于source命令

source /etc/profile.d/test.sh
. /etc/profile.d/test.sh ##二者等价

.号开头的文件在linux中是隐藏文件,ls命令不显示,需要加-a参数

ls -a
> .  ..  2  anaconda-ks.cfg  .bash_history  .bash_logout  .bash_profile  .bashrc  .cshrc  .mysql_history  .tcshrc  .viminfo
## .代表当前目录,..代表上级目录

正则表示中.匹配任意单个字符

grep "^S.urce.P" /etc/zabbix/zabbix_server.conf
> SourceIP=192.168.100.100

【"】和【'】

使用"和'的时候,需要了解一下特殊字符的概念,特殊字符是指字符不仅仅有表面字符的意义,还具有其他特殊意义的字符,比如*在正则中匹配任意数量的任意字符。

"和'具有引用的功能,可以保护shell或者shell脚本中被重新解释过或者带扩展功能的特殊字符,双引号部分引用(保留大部分特殊字符,例如不保留$),单引号全部引用(保留全部特殊字符)。

a=xyz;echo "$a" '$a'
> xyz $a

【,】

逗号运算符,将算术表达式串联在一起,表达式会被依次执行,但是只返回最后一个表达式的结果,还有就是可以在大括号中配合扩展。

ls {/usr,}/bin/* ##显示/usr/bin和/bin目录中所有的文件

【,,】【,】

在参数替换中进行小写字母转换。

【\】

转义符

\n ##换行
\r ##回车
\t ##水平制表符
\v ##垂直制表符
\b ##退格
\a ##警报、响铃或者闪烁
\0xx ##ASCII码的八进制形式

我们都知道bash脚本建议单行命令不要超过多少字符,建议在换行的时候用\来连接,其实这是转义的一种形式,echo打印长语句的时候也可以这么操作。其他的转移在遇到echo的时候,需要echo -e或者echo $'\n'这两种形式。

【/】

文件路径分隔符,算术运算中的除法运算符。

【``】

命令替换符号,`command`和$(command)的效果相当,可以将命令输出结果赋值给一个变量。

【:】

:;echo $? ## 它本身也是Bash的内建命令之一,返回值是true
while :;do echo yes;done ##无限循环
if condition;then :;else take-else-action;fi ##在控制语句中,和控制语句continue具有相同的效果
: ${username=`whoami`}
# ${username=`whoami`} ## 没有:就会报错,除非usename是系统命令或者内建命令
: ${1?"Usage: $0 ARGUMENT"} ##用于判断是否有位置参数1,没有的话报错并提示信息
: > data.xxx ##会清空data.xxx文件
/usr/local/bin:/bin:/usr/bin ##域分隔符

:还可以作为函数名,但是不建议这么做。

【!】

取反,主要用于bash中test各类参数的取反,=等于和!=不等于。

【*】

通配符扩展文件名,正则中的任意多个字符,包括0个字符和刚刚的.不一样。

算术计算中的乘法。

【?】

通配符,单字符扩展文件名,扩展正则中的单字符。

测试变量是否被赋值,并退出反馈说明。

: ${1?please check the parameters} -bash: 1: please check the parameters

【$】

变量取值,行尾结束符,在正则中$用于匹配行尾,文件的每行结尾都隐藏了$字符,cat –A可以看到。

【${}】

同上。

【$* $@】

位置参数列表。

vim position.sh
/bin/bash
echo $*
./position 1 2 3
> 1 2 3

【$?】

返回命令和脚本的执行状态,0是正常执行,1是异常执行。

【$$】

返回脚本的运行PID。

【()】

命令组,数组初始化赋值。在用用于一个命令组的时候,会开启一个subshell,这个子shell中设置的变量在括号中命令组执行结束后会失效,所以在subshell中慎用变量。

arrayA=(1 2 3);arrayB+=(1)
(a=1);echo $a
> ##这里echo并没有输出任何的结果
(a=1;echo $a)
> 1 ##父shell无法获取subshell的变量值

【[]】

和test功能一直,测试比较,在[]中填入测试表达式。数组下标。正则中的字符集或者范围。进行算术运算。

[ -z $var ] && echo “var is empty” ##判断var变量是否为空
ls [a-z]* [0-9]* ##列出以小写字母和大写字母开头的文件

【[[]]】

和test功能一致,测试比较,[[]]包含更高级的字符功能。

【{}】

扩展结构,函数符号,文本占位符。

cat {file1,file2,file3} > combined_file ##拼装大括号中的三个文件
cp file22.{txt,backup} ##复制 txt文件到backup文件
echo {file1,file2}\ :{\ A," B",' C'}
> file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
echo {a..c}
> a b c
find / -name *.log | xargs -i grep "pattern" {} ##文本占位符,这里{}代指前面的log文件

【$[]】

整数扩展符,可以用于整数计算

【(())】

整数扩展符,可以用于整数计算

【> >& >> < <>】

重定向符号,> <还可以用于ASCII码的比较

command &>filename ##将命令的stdout和stderr重定向到文件

【|】

管道pipe,上一个命令的输出作为下一个命令的输入或者直接输出到shell中,管道是一种可以将一系列命令连接在一起的绝妙方式。

grep "pattern" xx.log | sort |uniq | wc -l

【>|】

强制重定向,shell提供了一个noclobber的选项,防止不经意的重写已存在文件,但是>|可以无视这个选项,即使在noclobber被设置的情况下也会重写文件。

【||】

逻辑运算符or,也可以用于判断command的执行状态

find / -name xx.log && echo exist || echo not exist

【&】

后台运行操作符,如果命令后带&,那么此命令将转至后台运行

sleep 100 &;jobs;kill %1

【&&】

逻辑运算符and,也可以用于判断command的执行状态

【-】【--】

选项前缀,一个-一般是短选项,两个--一般是长选项,-变量扩展赋值符号
-代表先前的工作目录,cd –可以回溯到上一次打开的目录

【=】

算术运算的等号,变量赋值符号,变量扩展赋值符号(变量扩展章节中有介绍)

【+】

算术运算符,变量扩展赋值符号

【%】

取余

【~】【~+】【~-】

分别代表当$HOME,cd ~回到home目录,~=当前工作目录$PWD,~-和-一样$OLDPWD

【=~】

正则表达式*匹配

【^】【^^】

^行起始符号,两者都可以在参数替换中转换大写字符。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇