Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

$ awk {print $0} 1.txt

由于{ }在shell中并没关闭,那shell就将{print $0}视为command block,但同时又没有;符号作命令区隔,因此就出现awk的语法错误结果。要解决之,可用hard quote:

$ awk '{print $0}' 1.txt

上面的hard quote应好理解,就是将原本的{、<space>、$(注三)、}这几个shell meta关闭,避免掉在shell中遭到处理,而完整的成为awk参数中的command meta。(注三:而其中的$0是awk内置的field number,而非awk的变量,awk自身的变量无需使用$。)

要是理解了hard quote的功能,再来理解soft quote与escape就不难:

awk "{print $0}" 1.txt
awk {print $0} 1.txt

然而,若你要改变awk的$0的0值是从另一个shell变量读进呢?比方说:已有变量$A的值是0,那如何在command line中解决awk的$$A呢?你可以很直接否定掉hard quoe的方案:

$ awk '{print $$A}' 1.txt

那是因为$A的$在hard quote中是不能替换变量的。聪明的读者(如你!),经过本章学习,我想,应该可以解释为何我们可以使用如下操作了吧:

A=0
awk "{print $$A}" 1.txt
awk {print $$A} 1.txt
awk '{print $'$A'}' 1.txt
awk '{print $'"$A"'}' 1.txt #注:“$A”包在soft quote中

或许,你能举出更多的方案呢….^_^

第5问:var=value? export前后差在哪?
这次让我们暂时丢开command line,先来了解一下bash变量(variable)吧…

所谓的变量,就是利用一个特定的“名称”(name)来存取一段可以变化的“值”(value)。

设定(set)
在bash中,你可以用“=”来设定或重新定义变量的内容:

name=value

在设定变量的时侯,得遵守如下规则:

等号左右两边不能使用区隔符号(IFS),也应避免使用shell的保留字元(meta charactor)。

变量名称不能使用$符号。 变量名称的第一个字母不能是数字(number)。 变量名称长度不可超过256个字母。 变量名称及变量值之大小写是有区别的(case sensitive)。

如下是一些变量设定时常见的错误:

A= B # 不能有IFS 1A=B # 不能以数字开头 $A=B # 名称不能有$ a=B # 这跟a=b是不同的(这不是错误,提醒windows的使用者要特别注意)

如下则是可以接受的设定:

A=" B" # IFS被关闭了(请参考前面的quoting章节)
A1=B # 并非以数字开头
A=$B # $可用在变量值内
This_Is_A_Long_Name=b #可用_连接较长的名称或值,且大小写有别。

变量替换(substitution)
Shell之所以强大,其中的一个因素是它可以在命令行中对变量作替换(substitution)处理。
在命令行中使用者可以使用$符号加上变量名称(除了在用=号定义变量名称之外),