iOS之认识Shell3-常用的命令参考2

149 阅读1分钟

这是我参与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顺序执行命令cmd1cmd2cmd3, 各命令之间用分号隔开,最后一个命令后可以没有分号.
  • { cmd1;cmd2;cmd3;}: 在当前shell顺序执行命令cmd1cmd2cmd3。 各命令之间用分号隔开,最后一个命令后必须有分号,第一条命令和左括号之间必须用空格隔开。

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标准输出、标准输入和标准错误输出

标准输出和标准错误输出可以将内容重定向输出到指定的设备(如打印机)或文件中,
标准输入可以使用文件或其他输入替换手动输入。

  1. 标准输入(stdin):代码为0,符号:< 或者<<

  2. 标准输出(stdout):代码为1,符号:>或者>>

  3. 标准错误输出(stderr):代码为2,符号:2>或者2>>。 单箭头和双箭头的区别:

  4. 对于输出:

    • 单箭头:当指定的文件不存在时,创建新文件写入数据;当文件存在时,清空原文件的内容写入数据。
    • 双箭头:当指定的文件不存在时,创建新文件写入数据;当文件存在时,在原件内容的最后追加写入数据。
  5. 对于输入:

    • 单箭头:将文件或其他输入作为标准输入。(<的左边必须是命令,<右边的输入内容作为命令的输入)。
    • 双箭头:结束输入。

将标准输出和错误输出重定向到一个文件上:

  1. stdinstderr无序输出到one.log
grep "Cat"  file.log > one.log 2>one.log
  1. stdinstderr序有输出到one.log
#首先stdin重定向到one.log,然后使用2>&1表示stderr重定向至stdinstderrstdin之后输入到one.log中
grep "Cat"  file.log > one.log 2>&1
# 简写
grep "Cat" file.log  &> one.log