命令替换
在Shell编程时经常会用到命令替换,命令替换有两种方式:反引号(``)和$()符号。
反引号在Esc键的下方,它的作用是将命令字符替换为命令的执行结果。例如,替换ls命令,输出当前目录下的文件和目录。
也可以用$()来实现
I/O重定向
-
输入重定向
命令 0 <文件名
0是标准输入文件标识符,可以被省略。以wc命令为例,将yum.conf中的内容作为命令wc的输入,统计文件中的行数
-
输出重定向
命令 1>文件名
1是标注输出文件标识符,可以被省略。以cat命令为例,将,、etc/passwd文件中的内容重定向到file文件的具体操作如下
cat /etc/passwd > file
以上命令会将"cat /etc/passwd > file"的结果以覆盖的形式输入到file中
如果不想覆盖,可以使用>>以追加的形式附加到file中
- 错误重定向
命令 2>文件名
其中2是标准错误文件描述符,不可以被省略。例如打开一个不存在的文件会报错,如果使用错误重定向可以将错误信息输出达到文件中。下面打开不存在的文件cfile将其错误信息重定向到文件newfile中,命令如下所示
cat c 2>newfile
查看的结果如下
管道
管道符号为"|",它可以将多个简单的命令连接起来,使一个命令的输出,作为另外一个命令的输入由此来完成更加复杂的功能
命令1|命令2|...|命令n
以ls命令和grep命令的这为例来演示管道符的使用,具体如下所示
ls -l /etc |grep init
本地变量
本地变量相当于c语言中的局部变量,它只在本Shell中有效,如果Shell退出,本地变量将被销毁。本地变量的定义格式如下
NAME = value
NAME是变量名,value是赋给变量的值。如果value没有指定,变量将被复制为空字符串。在使用变量时,要在变量前面加"$"符号。例如,定义一个变量NAME,其值为Tom,在输出时,要以$NAME的形式输出
Shell还支持连续输出多个变量的值,例如,再定义一个变量AGE,其值为23,然后同时输出变量NAME与AGE
在定义本地变量时,还可以使用read命令从标准输入中读取变量值,其中read的-p选项可以设置输入提示信息
read -p"please input an int number:" INTNUM
删除变量的值可以使用unset命令
使用unset命令后,在输出该变量时值不再显示
环境变量
-
环境变量的定义与清除
环境变量在Shell编程和Linux系统管理方面都起着非常重要的作用,它一般用来存储路径列表,这些路径可用于搜索可执行文件、库文件等。环境变量定义格式如下所示
export ENVIRON_VARIABLE=value
环境变量必须要export关键字导出,export关键字的作用是声明次变量为环境变量,例如,定义APPSPATH变量并赋为/usr/local,然后利用export将APPSPATH声明为环境变量
在命令行中使用export定义的环境变量只在当前Shell与子Shell中有效,Shell重启后这些环境变量将丢失。
使用env命令可以查看所有的环境变量,包括用户自定义的环境变量。
env
删除环境变量和删除本地变量的方式相同,也是调用unset命令
-
几个重要的环境变量
bath中预设了很多环境变量,其中有几个比较重要的环境变量,Linux系统及诸多应用程序的正常运行都依赖它们。
-
PATH
PATH是Linux中极为重要的环境变量,它用于帮助Shell找到用户所输入的命令。用户输入的每个命令都是一个可执行的程序,计算机执行这个程序以实现这个命令的功能。可执行程序存在于不同目录下,PATH变量就记录了这一系列的目录列表
-
PWD和OLDPWD
PWD记录当前的目录路径,当利用cd命令切换到其他目录时,系统自动更新PWD的值,OLDPWD保存记录旧的工作目录。
-
HOME
HOME记录当前用户的家目录
-
SHELL
SHELL的变量值是/bin/bash,表示当前的Shell是bash。如果有必要使用其他Shell,则需要SHELL变量的值
-
USER和UID
USER和UID是用于保存用户信息的环境变量,USER保存已登录用户的名字,UID则保存已登录用户的ID。
-
PS1和PS2
PS1和PS2成为提示符变量,用于设置提示符格式。例如"[root@VM-0-5-centos ~]#"就是Shell提示符,[]里包含了当前用户名、主机名和当前目录等信息,这些信息并不是一成不变的,可以通过PS1和PS2的设置而改变
PS1用于设置一级Shell提示符,也称为主提示符。使用echo命令查看PS1的值
[root@VM-0-5-centos ~]# echo $PS1 [\u@\h \W]\$
由以上的输出结果可知,变量PS1包含4项内容,这4项内容的含义分别如下:
- \u表示当前用户名
- \h表示主机名
- \w表示当前目录名
- $是命令提示符,普通用户是$符号,如果是root用户,命令提示符是#符号
PS2用于设置二级Shell提示符,使用echo命令查看PS2的值,其结果如下:
[root@VM-0-5-centos ~]# echo $PS2 >
PS2的值为>符号,当输入命令不完整时,将会输入二级提示符
-
-
环境变量的配置文件
Linux中环境变量包括系统级和用户级,系统级的环境变量对每个用户都有效,而用户级的环境只对档期啊你用户有效。环境变量的配置文件也分为系统级和用户级,系统级的文件有很多,例如/etc/profile、/etc/profile.d、/etcbashrc、/etc/environment,在这些文件中定义的环境变量对所有用户都是永久有效的。用户级的环境变量配置文件主要是.bash_profile和.bashrc两个文件,它们位于用户的家目录下。
位置变量
位置变量主要用于接收传入Shell脚本的参数,因此位置变量也被称为位置参数。位置变量的名称由"$"与整数组成,命名规则如下所示
$n
$n用于接收传递给Shell脚本的第n个参数,如变量$1接收传入脚本的第一个参数。当位置变量名中的整数大于9时,需使用{}将其括起来,如脚本中的第11个位置参数应表示为${11}。位置便令是Shell中唯一全部使用数字命名的变量。需要主要的是,n是从1开始的,$0表示脚本自身的名称
编写test.sh脚本,内容如下:
#!/bin/bash
echo "The Script's name is : $0"
echo "Parameter #1: $1"
echo "Parameter #2: $2"
echo "Parameter #3: $3"
echo "Parameter #4: $4"
echo "Parameter #5: $5"
echo "Parameter #6: $6"
echo "Parameter #7: $7"
echo "Parameter #8: $8"
echo "Parameter #9: $9"
echo "Parameter #10: ${10}"
执行脚本并且传参
在接受参数时,位置变量值根据位置来接受响应参数,比如修改脚本为
#!/bin/bash
echo "The Script's name is : $0"
echo "Parameter #8: $8"
修改后的脚本只保留一个第8个位置的变量,再次执行这个脚本还是传递10个参数,结果如下所示
在纳入的参数中,第8个位置是h,$8读取到了相应位置的参数。如果传入的参数不足8个,那么$8为空。
特殊变量
除了上述几个变量之外,Shell还定义了一些特殊变量,主要用来查看脚本的运作信息
Shell中常用的特殊变量如下所示
-
$#:传递到脚本的参数数量
-
$*和$@:传递到脚本的所有参数
-
$?:命令退出状态,0表示正常退出,非0表示异常退出
-
$$:表示进程的PID
修改test.sh,增加几行代码,如下所示
#!/bin/bash
echo "The Script's name is : $0"
echo "Parameter #1: $1"
echo "Parameter #2: $2"
echo "Parameter #3: $3"
echo "Parameter #4: $4"
echo "Parameter #5: $5"
echo "Parameter #6: $6"
echo "Parameter #7: $7"
echo "Parameter #8: $8"
echo "Parameter #9: $9"
echo "Parameter #10: ${10}"
#新增代码
echo "Parameter count:$#"
echo "All Parameter:$*"
echo "All Parameter:$@"
echo "PID:$$"
运行结果为