Skip to content

Latest commit

 

History

History
182 lines (114 loc) · 5.67 KB

0X06_别名和变量.md

File metadata and controls

182 lines (114 loc) · 5.67 KB

0X06 别名和变量

命令别名

有时候有的命令太长我们希望用一个短命令来替换,或者你不喜欢命令原本的名称,想给命令改一个名字.这时候就能用到命令别名了.给一个命令设置别名之后,输入别名就相当于输入了命令本身.而且别名之后还能再追加参数.

设置命令别名用alias命令:

alias la = 'ls -al'

这之后使用'la'命令就能替代命令'ls -al'.如果要撤销命令别名,使用命令unalias.

unalias la

变量

shell命令一般也是一种完备的脚本语言.可以创建变量,运算表达式,构造函数或者进行流程控制.

我们先来介绍变量.

如果在bash中直接执行一个等号链接的表达式.就相当于Lua中的赋值语句.

例如:

valueA=123

这就创建了一个名为valueA的变量.其值为123.

shell命令不像Lua交互式编程环境那样会自动显示最后执行的表达式的结果.所以要显示变量内容我们需要一个类似于Lua中print的命令echo.

echo后加的所有参数是要输出的内容.

echo 13123
echo hello world
echo 'hello world'

加单引号或者双引号的表示这是一个字符串.但是在不引起混淆的情况下,我们不需要加引号来表示字符串.因为基本上bash中的一切值都会默认当作字符串进行处理.(使用引号明示字符串,最主要的情景就是防止空格把多个单词分割为多个字符串或者字符串中包含一些有特殊语义的符号.)

如果使用:

echo valueA

会输出字符串'valueA'本身.要输出变量valueA的值,需要在变量名前加dollar符$.例如

echo $valueA

注意,在赋值的时候变量名前不需要加$,但是在读取变量的值时需要加$.例如变量之间的赋值:

valueB = $valueA
echo $valueB

环境变量

一些特殊名称的变量,会对bash起到设置的作用.例如:

HOME表示当前用户的主目录.

PATH表示命令的来源.(当输入一个命令名时,如果在PATH指定的路径下有同名文件,就会执行那个同名文件.例如/bin下就有一个bash文件,所以直接输入命令bash就能执行.)

SHELL表示当前用户Shell的可执行文件路径.

这些变量有的只供查看(更改了也会自动该回去),用于查询一些当前系统状态的信息.

有的变量被修改之后则会影响bash或者系统的行为.例如把当前自己的主路径追加到PATH中:

PATH=$PATH:~

在执行这条命令之前,执行主目录下的文件必须使用以'.'开头的相对路径或者绝对路径.而在执行这条命令之后.直接输入文件名就可以执行.(冒号用于分割PATH中原有内容和这次新增内容.波浪线''是自己主目录的相对路径.事实上,bash会自动把多个字符串变量(这里的PATH,':'和'')连接到一起.)

可以在bash手册Shell Variables一节查所有bash的环境变量及其作用.如果你用的是zsh,那么有的环境变量名可能和bash不一样.

bash中可以通过help variables命令查看bash提供的环境变量的帮助信息.(variables只是一个帮助手册的章节,而不是命令名.)

不带参数的set指令一般用来查看环境变量的值和bash内置的一些脚本函数。

也可以使用Coreutils提供的printenv,env等命令来查看环境变量.(env命令也可以作为命令前缀,用于让一条命令在指定的一个变量环境中运行.)

特殊变量

除了环境变量还有所谓的特殊变量(Special Parameters).特殊变量用于表示一些与shell进程相关的信息.特殊变量名都是一些特殊符号.如$表示当前进程PID等.引用的时候也要加美元符号echo $$.

特殊变量只能读不能写.

变量使用

变量的值可以作为命令或者命令的参数使用.例如:

cmd='ls'
$cmd
mydir='/bin'
$cmd $mydir
$cmd $HOME

这个例子中的路径中不能使用波浪线(因为不识别).

另一种把变量内容当命令用的办法是用eval命令:

eval $cmd

读入变量

一般的编程语言中有输出就有输入,例如Lua中有io.write和io.read.

在bash中如果要读入一个字符串作为变量的值就用bash内置的read命令.:

read myValue

执行这个命令后,bash就会等你键入一个字符串(以回车结束).这里的myValue是一个变量名.

bash中另外有一个命令为readarray用于读入数组.

命令执行结果作为变量

bash还可以使用命令的执行结果作为变量的值.使用方法是用圆括号把命令括起来,然后在前边加$.例如:

myValue = $(ls /bin)
echo $myValue

删除变量

如果想删除某个变量就使用unset命令.这个命令后的变量名不需要加美元符号.

unset myVar

另外,在bash中使用了一个没有定义过的变量其实也不会报错.只不过这个变量默认值为空.

脚本编程

bash本身有一套完整的编程语法.可以定义数组,计算表达式,进行流程控制,定义函数等.比如:

if [ $var1 -eq $var2 ] && [ $var2 -eq $var3 ] ; then echo 'equal' ;fi
myVar=(one two three 'hello bash')
echo ${myVar[2]}
echo ${myVar[3]}

但是bash的编程语句混乱且复杂,并不适合用来写大型的程序.而且最现实的问题是,如果要维护bash脚本你就需要新学一门和C,Java,Python等不相关的语言.

所以我推荐尽量使用Python脚本或者Lua脚本来替代拥有复杂逻辑处理的Bash脚本.

如果你使用Lua,那么主要会涉及到一个名为os.execute的函数,例如:

os.execute('ls /bin')

如果你使用Python则会涉及os模块,例如:

import os
os.system('ls /bin')