linux⼩于号脚本,shell⾥⾯的奇葩字符实现
在我接触过的编程语⾔⾥⾯,最奇葩的两个就属 JavaScript 和 Shell 了。因为它们有着太多的语法糖跟特殊字符,总是能够让你措⼿不及,并且编程习惯也跟Java 和 Python 等语⾔⼤相径庭。总之,千万不要因为它们是脚本语⾔就轻视它们,否则你就会被打得晕头转向。
这两个奇葩之间⽐起来呢,Shell 的奇葩之处在于特殊符号多,骚操作也多。⽐如你以为 .  这是个点,其实它代表的意思远不⽌⼀个点那么简单 。
下⾯的内容是我根据⽹上资料及平时使⽤经验整理的⼀份Shell 中的特殊字符。如果⼤家觉得有⽤的话就点赞收藏吧。
; 单分号,⼀般作为命令分隔符。可以将两个命令放在同⼀⾏。如: echo hello; echo there,但真正写脚本的时候尽量不要这样写。
;; 双分号,⽤在 case条件语句的结束符。如:
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac
% 百分号,⽤于表⽰取余操作,也⽤于正则表达式。
~  波浪线,表⽰家⽬录,等价于$HOME。如 cd ~
~+  表⽰当前⼯作⽬录,等价于$PWD。
~-  表⽰上⼀个⼯作⽬录,等价于 ..。
|  管道标识符,将上⼀个命令的输出作为下⼀个命令的输⼊,经常⽤到,没什么好说的。
>|  强制重定向。强制重写已经存在的⽂件。
||  表⽰逻辑或操作。
&  让命令在后台运⾏,例如 command &  ⼀般⽤于启动后台进程服务。
&&  表⽰逻辑与操作。
* 星号,主要⽤于通配符匹配,当然也⽤于乘法表达式。
\ 主要⽤于转义特殊字符,⽐如想转义双引号,可以这样 echo \" 输出 “。
/  ⽂件路径分隔符,⽐如 /opt/app/projects/ 。当然也⽤作除法表达式。
. 点号,这个符号作⽤⽐较多。 ⾸先可以等价于 source 命令。也可以作为⽂件名字,在⽂件名开头,表⽰该⽂件是个隐藏⽂件。 还可以表⽰当前⽬录, ⽐如拷贝某个⽂件到当前⽬录 cp /opt/app/a.md . 。如果是两个连续的点则表⽰上⼀级⽬录,⽐如 cd ..。
最后,点号也是正则表达式的元字符。
"  双引号,双引号⾥⾯的变量⼀般会被解析成赋值的内容。⽐如
name=frank
echo "hello $name" # hello frank
' 单引号,单引号⾥⾯的变量⼀般不会被解析,⽐如
name=frank
echo 'hello $name' #hello $name
' 反引号(ESC键下⾯那个),要跟单引号区分开。反引号⾥⾯的内容会被当作指令执⾏,并将执⾏的结果赋值给变量。⽐如:
file=`ls ~`
echo $file #家⽬录下所有⽂件。
!  感叹号,⼀般⽤于取反。⽐如 != 表⽰不等。骚操作在终端中执⾏,可以表⽰历史指令⽐如 !-3,将会输出你刚刚输⼊的指令。但在脚本中不⽀持该种写法。
**  双星号,算术运算中表⽰求幂运算。⽐如
let "a=3**2"
echo $a #9
问号,表⽰条件测试;也⽤作三元运算符。也是正则表达式元字符。
$  美元符,放到变量前⾯,即引⽤⼀个变量的内容,⽐如:echo $PATH;当然也是正则表达式的元字
符。
${} 参数替换。⽤于在字符串中表⽰变量值。⽐如
name=frank
echo "hello ${name}" #hello frank
$*,$@ 这两个特殊字符都⽤于获取传递给脚本的所有参数。当他们被双引号包围时,"$*"会将所有的参数从整体上看做⼀份数据。⽽"$@"仍然将每个参数都看作⼀份数据,彼此之间是独⽴的。
linux循环执行命令脚本$#  表⽰参数个数。
$?  返回最近的⼀个命令或脚本的退出状态码,正确执⾏则返回0,否则返回⾮0。
$$  双美元符, 返回当前脚本的进程号。
() ⼩括号,命令组,⼀组圆括号括起来的命令代表⼀个命令组,以⼦shell⽅式运⾏。同时⼩括号⾥⾯的的变量类似局部变量,外部不能访问。⽐如
a=123
( a=321; )
echo "a = $a" # a = 123
还可以⽤于数组初始化。例如
arr=(ele1 ele2 ele3)
echo ${arr[1]} # ele2
{xxx,yyy,zzz} 有⼈叫花括号扩展,我举⼏个例⼦,可能⼤家就明⽩了。注意不能有空格。
echo {a,b,c}-{d,e,f} # a-d a-e a-f b-d b-e b-f c-d c-e c-f
cat {file1,file2,file3} > merge_file #将三个file的内容⼀同输⼊merge_file
cp file.{txt,backup} #拷贝成file.backup
{a..z}  跟上⾯类似,还是看例⼦吧。
echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z
echo {0..3} # 0 1 2 3
{}  花括号,表⽰代码块 ,也⽤于表⽰匿名函数。也可以结合重定向符使⽤。例如:
fileline=~/a.txt
{
read line1
read line2
} < $fileline
echo $line1
echo $lien2
会将a.txt的前两⾏内容赋值给变量line1和line2;
骚操作在xargs -i中,还可以作为⽂本的占位符,⽤来标记输出⽂本的位置。
⽐如 ls *.txt | xargs -i -t cp {} {}.bak 会把所有txt⽂件拷贝⼀份,命名成txt.bak
{} \;  表⽰路径名字。⼀般跟find命令⼀起使⽤。例如 find . -name "*.sh" -exec rm {} \;出所有sh脚本,然后删除。注意{} 和 \ 之间的空格,分号必须存在。
[]  中括号,⽤于在⾥⾯写判断表达式。也可以当作数组⽤。当然也是正则表达式元字符。
[[]]  双中括号,也⽤于在⾥⾯写判断表达式,⽐上⾯但中括号更灵活。
$[]  计算整数表达式,已经不推荐使⽤。例如
a=3;
b=7;
echo $[$a+$b] # 10
(())  双⼩括号, 计算整数表达式,推荐使⽤。如
a = 23
(( a++ ))
echo "a (after a++) = $a" # 24
> ,&>, >&, >>  这四个都是重定向符,分别举例说明。
cat ~/a.txt >a.log  将⽂件a.txt的内容输出到⽂件a.log中去,如果⽂件存在则覆盖;
command &>filename 重定向command的标准输出(stdout)和标准错误(stderr)到⽂件filename中,⼀般⽤于启动进程脚本;
command >&2 把command的标准输出(stdout)重定向到标准错误(stderr)中;
cat ~/a.txt >> a.log  把a.txt的输出以追加得⽅式输⼊到⽂件a.log中,如果⽂件不存在则创建。
-  短横线,可⽤于参数选择 例如 ls -al。 也可以表⽰上⼀个⼯作⽬录,例如 cd -。当然也是数学运算符,⽤于表⽰减法操作。
=  等号,数学运算符,赋值操作。 例如
a=28
echo $a
也可以⽤于表⽰⽐较操作,例如,if [ "$a" = "$b" ]  注意等号左右两侧要有空格。
#  井号,⼀般⽤于注释语句前⾯,表⽰该条语句是注释。也是正则表达式的元字符。
注意:
脚本的第⼀⾏#!/bin/bash 不作为注释,在双引号或者单引号以及转义字符之后的也不会作为注释符使⽤。例如
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 $((2#101)) #5
echo $((8#101)) #65
echo $((10#101)) #101
,  逗号,⽤于连接⼀连串的数学表达式,这串数学表达式均被求值,但只有最后⼀个求值结果被返回。例如:
# Set "a = 9" and "t2 = 15 / 3"
let "t2 = ((a = 9, 15 / 3))"
也可以⽤于连接字符串,⽐如 echo {a,b}/test  输出 a/test b/test
骚操作  ⽤在变量引⽤中,表⽰⾸字母⼩写,如果是两个逗号,则表⽰全部⼩写。例如
a="AFrank"
echo ${a,} #aFrank
echo ${a,,} #afrank
+ 数学运算符,表⽰加操作。也是正则表达式元字符。
骚操作 ⽤于设置变量值。使⽤⽅式 ${parameter+alt_value}  如果变量 parameter 设置了值,则使⽤ alt_value 的值,否则使⽤空字符。举个例⼦,感受⼀下
#param1 not set
a=${param1+xyz}
echo "a = $a" # a =
#parma2 set null
param2=
a=${param2+xyz}
echo "a = $a" # a = xyz
param3=123
a=${param3+xyz}
echo "a = $a" # a = xyz
注意 配合冒号使⽤时会有不同。举个例⼦,继续感受⼀下
a=${param4:+xyz}
echo "a = $a" # a =
param5=
a=${param5:+xyz}
echo "a = $a" # a =
#Different result from a=${param5+xyz}
param6=123
a=${param6:+xyz}
echo "a = $a" # a = xyz
^  ⽤于正则表达式。
骚操作  ⽤于⼤⼩写转化。看下⾯的例⼦。
var=hellFrank
echo ${var^} # HelloFrank
echo ${var^^} # HELLOFRANK
<< 双⼩于号,称作 here-doc。⼀般⽤于给命令提供输⼊多⾏内容。⽐如
tr a-z A-Z <
> one
> two
> three
> EOF
输出:
ONE  TWO  THREE
默认的,here doc⾥⾯的变量会进⾏替换。⽐如
cat << EOF
> Working dir $PWD
> EOF
输出:Working dir /home/frank
如果给here doc 标识符加上双引号或者单引号则会禁⽌变量替换。⽐如
cat << "EOF"
> Working dir $PWD
> EOF
输出:Working dir $PWD
骚操作
再 <
tr a-z A-Z <
> one
> two
> three
> EOF
输出:ONE  TWO  THREE
<<< 三个⼩于号,称作here string,here doc的变种。⽐here doc更灵活。例如

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。