1.环境变量
环境变量常用大写字母表示。常见的环境变量有HOSTNAME、SHELL、HISTSIZE、USER、PATH、PWD、LANG、HOME、LOGNAME。分别表示当前主机名、SHELL的路径即bash的类型、history保存多少记录、当前用户名、自动搜索路径、当前目录、使用的语系(临时修改语系时就改这个变量)、当前用户的家目录、当前登录的用户。 查看当前用户的环境变量。 [root@master ~]# env
2.普通变量
bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。 赋值: str=value 。等号左右没有空格。如果有空格就是进行比较运算符的比较运算了。 变量引用:{str} 。 str=‘Hello World!’ 释放变量: unset str ,变量名前不加前缀$。 查看所有变量:不接任何参数的set或者declar 定义只读变量: readonly str 。 临时将普通变量升级为环境变量: export str 或者赋值时 export str=“value” 。
[root@master~]# str='Hello World!';echo $str
Hello World!
[root@master~]# bash # 开启子shell
[root@master~]# echo ${str} # 子shell中查看变量结果发现没有该变量。
在子shell中查看变量,结果竟然没有该变量。这是因为$str的作用域只在当前shell,要想在子shell中也能引用普通变量,则需要使用export升级为环境变量。
[root@master ~]# exit # 退出子shell
[root@master ~]# export str # 回到父shell升级该变量
[root@master ~]# bash
[root@master ~]# echo $str
Hello World!
3.获取变量长度
echo ${#str}
echo ${#PATH}
4.declare声明变量
见 “Linux—— declare” 章节
5.位置变量和特殊变量
$?:上一条代码执行情况,0正确执行。
$$:当前shell的PID。
$BASHPID:当前shell的PID。
$!:最近一次执行的后台进程PID。
$#:参数的总个数。
$@:所有单个参数,如"a""b""c""d"。
$*:所有参数的整体,如“abcd”。
$0:脚本名。
$1……$n:参数位置。
$*与$@的区别:
$*将命令行的所有参数视为一个字符串:"$1$2$3..."
$@将命令行的每个参数视为单个的字符串:"$1" "$2" "$3" ...
6.shift
shift N 就踢掉N个参数,默认N为1。
7.变量赋值
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值;{parameter:-word}几乎等价,除了parameter设置了但为空时,变量的结果将是null,而非word。在/etc/init.d/httpd中有此用法。 ${parameter:+word}:如果parameter为空或未定义,不做任何操作,即仍然为空;否则展开为“word”值; ${parameter:=word}:如果parameter为空或未定义,则变量赋值(注意是赋值,不是展开)为“word”,否则为parameter自身;{para:=word}。 ${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符; ${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
8.mktemp创建临时文件或目录
mktemp [-d] /tmp/file.XX # X指定越多,随机生成的后缀就越长,其中-d表示创建临时目录。
[root@master ~]# mktemp haha.XXX
haha.oOe
[root@master ~]# mktemp -d haha.XXX
haha.npz
[root@master ~]# touch haha.npz/A.txt
9.变量的切分、提取和替换
将文件名"Linux.docx.jpg"存放到变量file_name中,然后执行从左向右或从右向左的删除或贪婪删除。
[root@master tmp]# file_name="Linux.docx.jpg"
[root@master tmp]# file_name_greedy=${file_name%%.*}
[root@master tmp]# file_name_nongreedy=${file_name%.*}
[root@master tmp]# extention_name_greedy=${file_name##*.}
[root@master tmp]# extention_name_nongreedy=${file_name#*.}
[root@master tmp]# echo -e "${file_name_greedy}\n${file_name_nongreedy}\n${extention_name_greedy}\n${extention_name_nongreedy}"
Linux
Linux.docx
jpg
docx.jpg
${var%%.} 和 ${var%.} 中的 %%.* 表示从右向左匹配 .* 并删除,由于Linux.docx.jpg有两种符合条件的匹配:".jpg"和".docx.jpg",所以使用两个"%%“表示贪婪删除,即删除最长匹配”.docx.jpg"。可以使用一个%表示非贪婪删除,表示删除最短的匹配即".jpg"。 ${var##.} 和 ${var#.} 中的 ##*. 表示从左向右匹配 . 并执行贪婪删除,即删除"Linux.docx.",同理 #. 表示非贪婪删除,即删除"Linux."。
[root@master tmp]# echo "${file_name:0:5}" # 提取第0个字节后的5个字节,即1-5字节
Linux
[root@master tmp]# echo "${file_name:6:4}" # 提取第6个字节后的4个字节,即第7、8、9、10字节
docx
[root@master tmp]# echo "${file_name/jpg/pdf}" # 非贪婪替换jpg为pdf,即只替换从左向右的第一个
Linux.docx.pdf
[root@master tmp]# echo "${file_name//jpg/pdf}" # 贪婪替换jpg为pdf,即所有的jpg都替换为pdf
Linux.docx.pdf
不错的功能是替换。有时候想要删除PATH环境变量中的某个路径,可以使用变量替换的功能,似乎没法使用变量切分来实现。
[root@toystory php]# echo $A
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin:/usr/local/mysql:/usr/local/apache/bin
注意,由于可能多次读取了配置文件,导致PATH中出现了重复的路径。现在想删除其中一个路径。使用下面的命令就可以实现路径删除,注意其中使用了转义符号,并且变量替换的替换值留空了表示删除前面匹配的部分。
[root@toystory php]# B=${A/:\/usr\/local\/apache\/bin/}
[root@toystory php]# echo $B
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql:/usr/local/apache/bin