这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战。
Shell
里面的括号
${a}
:变量a
的值, 在不引起歧义的情况下可以省略大括号。$(cmd)
:命令替换, 和cmd
效果相同。$((exp))
:增强括号的用法和expr exp
效果相同, 计算数学表达式exp
的数值,,其中exp
只要符合C
语言的运算规则即可,甚至三目运算符和逻辑表达式都可以计算。可以省略$
。比如:
for((i=0;i<5;i++))
# 如果不使用双括号
for i in seq 0 4
for i in {0..4}
if (($i<5))
# 如果不使用双括号
if [ $i -lt 5 ]
(cmd1;cmd2;cmd3)
新开一个子shell
顺序执行命令cmd1
、cmd2
,cmd3
, 各命令之间用分号隔开,最后一个命令后可以没有分号.{ cmd1;cmd2;cmd3;}
: 在当前shell
顺序执行命令cmd1
、cmd2
和cmd3
。 各命令之间用分号隔开,最后一个命令后必须有分号,第一条命令和左括号之间必须用空格隔开。
Shell
里面的中括号(包括[]
与[[]]
)可用于一些条件的测试:
- 算术比较,比如一个变量是否为0:
[ $var -eq 0 ]
。 - 文件属性测试,比如一个文件是否存在:
[ -e $var ]
。 是否是目录:[ -d $var ]
。 [[]]
:字符串比较,增强方括号用法,双括号中的表达式可以使用&&
、||
、<
、>
等语法。比如:
# 比较两个字符串是否相同
[[ $var1 = $var2 ]]
if [[ $a != 1 && $a != 2 ]]
# 如果不使用[[]]
if [ $a -ne 1] && [ $a != 2 ]
if [ $a -ne 1 -a $a != 2 ]
对{}
和()
而言,括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令.
Shell
里面的单引号和双引号
首先,单引号和双引号,都是为了解决中间有空格的问题。
因为空格在shell
中作为一个很典型的分隔符,比如string1=this is astring
,这样执行就会报错。为了避免这个问题,因此就产生了单引号和双引号。他们的区别在于,单引号将剥夺其中的所有字符的特殊含义,而双引号中的 $
(参数替换)和反引号(命令替换与$()
作用一样)是例外。所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符反引号。
Shell
标准输出、标准输入和标准错误输出
标准输出和标准错误输出可以将内容重定向输出到指定的设备(如打印机)或文件中,
标准输入可以使用文件或其他输入替换手动输入。
-
标准输入(
stdin
):代码为0,符号:< 或者<<
; -
标准输出(
stdout
):代码为1,符号:>或者>>
; -
标准错误输出(stderr):代码为2,符号:
2>或者2>>
。 单箭头和双箭头的区别: -
对于输出:
- 单箭头:当指定的文件不存在时,创建新文件写入数据;当文件存在时,清空原文件的内容写入数据。
- 双箭头:当指定的文件不存在时,创建新文件写入数据;当文件存在时,在原件内容的最后追加写入数据。
-
对于输入:
- 单箭头:将文件或其他输入作为标准输入。(
<
的左边必须是命令,<
右边的输入内容作为命令的输入)。 - 双箭头:结束输入。
- 单箭头:将文件或其他输入作为标准输入。(
将标准输出和错误输出重定向到一个文件上:
- 将
stdin
和stderr
无序输出到one.log
:
grep "Cat" file.log > one.log 2>one.log
- 将
stdin
和stderr
序有输出到one.log
:
#首先stdin重定向到one.log,然后使用2>&1表示stderr重定向至stdin,stderr在stdin之后输入到one.log中
grep "Cat" file.log > one.log 2>&1
# 简写
grep "Cat" file.log &> one.log