1、shell变量分本地变量与环境变量
局部(本地)变量:本地变量在用户现在的shell生命周期的脚本中使用
定义:变量名=值
-
- 等号两边不可以有空格
- 取值包括空格,必须用双引号括起来
- shell变量区分大小写
- 声明变量不用声明类型
- 可以存储不同类型的内容
- 使用灵活
- 使用时要明确变量的类型
- 必须以字母或下划线开头,不能以数字开头定义变量.
清除变量:
-
- name=arcerzhang --定义变量
- echo ${name} --输出变量
- unset name --清除变量
变量扩展修饰符:
${name:-arcerzhang} 假如变量name存在,且非空则直接输出name的值,否则将arcerzhang的值赋给name,然后输出.
${variable:=word}
${variable:+word}
${variable:?word}
${variable:offset}
环境变量:
2、设置只读变量
[arcerzhang@DG2 shell]$ readonly freeviedo=boobooke [arcerzhang@DG2 shell]$ freeviedo=arcerzhang -bash: freeviedo: readonly variable [arcerzhang@DG2 shell]$
3、环境变量
环境变量用于所有用户进程(经常称为子进程)。登陆进程为父进程;
- 环境变量可用于所有子进程,这包括编辑器、脚本和应用
- 环境变量可用于在命令行中设置,但用户注销时这些值将丢失
- 环境变量均为大写
- 必须用export命令导出
设置环境变量
- VARIABLE-NAME=value; export VARIABLE-NAME
- VARIABLE-NAME=value
- export VARIABLE-NAME
4、定义数组
[arcerzhang@arcerzhang shell]$ clear [arcerzhang@arcerzhang shell]$ myarr=(arcerzhang maryhu lyidazhang) [arcerzhang@arcerzhang shell]$ echo ${#myarr} 10 [arcerzhang@arcerzhang shell]$
查看数组元素的个数
[arcerzhang@arcerzhang ~]$ myarr=(arcerzhang maryhu lydiazhang) [arcerzhang@arcerzhang ~]$ echo ${#myarr[*]} 3 [arcerzhang@arcerzhang ~]$
输出数组中的元素;默认从0开始;统计数组第一个元素的长度${#myarr}
[arcerzhang@arcerzhang ~]$ myarr=(arcerzhang maryhu lydiazhang) [arcerzhang@arcerzhang ~]$ echo ${#myarr[*]} 3 [arcerzhang@arcerzhang ~]$ echo ${myarr[1]} maryhu [arcerzhang@arcerzhang ~]$ echo ${myarr[0]} arcerzhang [arcerzhang@arcerzhang ~]$ echo ${myarr[0]} ${myarr[1]} arcerzhang maryhu [arcerzhang@arcerzhang ~]$ echo ${myarr[0]} ${myarr[1]} ${myarr[2]} arcerzhang maryhu lydiazhang [arcerzhang@arcerzhang ~]$
输出所有元素:echo ${myarr[*]}
5、特定变量参数
- $# 传递 到脚本的参数个数
- $* 以一个单字符串显示所有向脚本传递的参数
- $$ 脚本运行的当前进程ID号
- $! 后台运行的最后一个进程的进程ID号
- $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
- $- 显示sehll使用的当前选项,与set命令功能相同
- $? 显示最后命令的退出状态。0表示没有错误,其他值表示有错误.
6、变量扩展
- ${var:pos} 变量var从位置pos开始扩展
- ${var:pos:len}从位置pos开始,并扩展len长度个字符
- ${var/Pattern/Replacement}使用Replacement来替换var中的第一个Pattern的匹配
- ${var//Pattern/Replacement}全局替换在var中所有的匹配,都会用Replacement来替换
7、指定类型的变量
declare或者typeset
- -r 只读
- declare -r var1
- declare -r var2与readonly var1是完全一样的
- -i 整形
- declare -i number
- -a 数组
- -f 函数
- -x export
8、变量的间接引用
[arcerzhang@DG3 shell]$ admin=wilson [arcerzhang@DG3 shell]$ wilson=boobooke [arcerzhang@DG3 shell]$ echo $admin wilson [arcerzhang@DG3 shell]$ eval admin=\$$admin [arcerzhang@DG3 shell]$ echo ${admin} boobooke [arcerzhang@DG3 shell]$
9、特殊字符
#
注释,行首以#开头为注释(#!是个例外)
注释也可以存在与本行命令的后边
命令是不能跟在同一行上注释的后边的
在echo命令中被转义的#是不能作为注释的
#也可以出现在特定的参数替换结构中或者是数字常量表达式中
[arcerzhang@DG3 ~]$ echo "The #here does not begin a comment." The #here does not begin a comment. [arcerzhang@DG3 ~]$ echo 'The #here does not begin a comment.' The #here does not begin a comment. [arcerzhang@DG3 ~]$ echo The \#here does not begin a comment. The #here does not begin a comment. [arcerzhang@DG3 ~]$ echo The #这里开始一个注释 The [arcerzhang@DG3 ~]$
echo ${PATH#*:} #参数替换,不是一个注释
echo $((2#101011)) #数制转换,不是一个注释
[arcerzhang@DG3 ~]$ echo $((2#101011)) 43
#Thanks,S.C.
;
命令分隔符,可以用来在一行中来写多个命令
filename=arcerzhang.log if [ -x "$filename" ] ;then echo "File $filename exists.";cp $filename $filename.bak else echo "File $filename not fount.";touch $filename fi;echo "File test complete."
;;
终止"case"选项.
#!/bin/bash var=abc case "$var" in abc) echo "\$var=abc";; xyz) echo "\$var=xyz";; esac
.
.作为文件名的一部分。如果作为文件名的前缀的话,那么这个文件将成为隐藏文件
.命令如果作为目录名的一部分的话,那么.表达的是当前目录.".."表示上一级目录
.字符匹配,这是作为正则表达式的一部分,用来匹配任何的单个字符
demo:匹配第四位为x(可执行权限的文件)
[arcerzhang@DG3 shell]$ ls -l | grep ^...x -rwxrw-r-- 1 arcerzhang arcerzhang 88 3月 31 23:29 case.sh -rwxrw-r-- 1 arcerzhang arcerzhang 195 3月 31 23:22 cmd.sh -rwxrw-r-- 1 arcerzhang arcerzhang 48 3月 31 22:46 hello.sh -rwxrw-r-- 1 arcerzhang arcerzhang 62 3月 31 13:30 param.sh -rwx--x--x 1 arcerzhang arcerzhang 218 3月 31 13:16 random.sh
"部分引用"STRING"阻止了一部分特殊字符
[arcerzhang@DG3 shell]$ welcom=How [arcerzhang@DG3 shell]$ welcom=How are you -bash: are: command not found [arcerzhang@DG3 shell]$ welcom="How are you" [arcerzhang@DG3 shell]$ echo ${welcom} How are you [arcerzhang@DG3 shell]$
'全引用.'STRING'阻止了全部特殊字符
[arcerzhang@DG3 shell]$ echo ${welcom} How are you [arcerzhang@DG3 shell]$ echo '${welcom}' ${welcom} [arcerzhang@DG3 shell]$
,逗号链接了一系列的算术运算操作
[arcerzhang@DG3 shell]$ let "var=((a=9,15/3))" [arcerzhang@DG3 shell]$ echo ${var} 5 [arcerzhang@DG3 shell]$
所有的内容都被运行了,但只有最后一项被返回.
\ 转义字符
[arcerzhang@DG3 shell]$ echo "This is a book" This is a book [arcerzhang@DG3 shell]$ echo "This is a \"book\"" This is a "book" [arcerzhang@DG3 shell]$
/文件名路径分隔符.或用来做除法操作
[arcerzhang@DG3 shell]$ cd /etc/sysconfig/ [arcerzhang@DG3 sysconfig]$ let x=16/4 [arcerzhang@DG3 sysconfig]$ echo ${x} 4 [arcerzhang@DG3 sysconfig]$
`后置引用,命令替换
[arcerzhang@DG3 ~]$ echo "您当前所在的目录是`pwd`" 您当前所在的目录是/home/arcerzhang [arcerzhang@DG3 ~]$
:空命令(true作用等同于=:)
#!/bin/bash while : do echo "welcom boobooke" sleep 5 done #!/bin/bash while true do echo "welcom boobooke" sleep 5 done
!取反操作符
#!/bin/bash x=1 y=2 if [ "$x" != "$y" ] then echo "x不等于y" else echo "x等于y" fi
*万能匹配字符(数学运算符)
#操作符号* 表示乘 let b=5*5 echo $b #**表示幂次方 let c=2**10 echo $c
?测试操作结果
#?测试操作结果,查看返回状态码 mkdir /root echo $?
#变量替换
#变量替换 a=5 b=7 echo $a $b
$在正则表达式中作为行结束符
${}参数替换
$*,$@位置参数
$?退出状态百年来那个.$?保存一个命令/一个函数或者脚本本身的退出状态
$$进程ID变量.这个$$变量保存运行脚本进程ID
()命令组
arr=(arcerzhang maryhu lydiazhang) echo $arr #输出第一个元素 echo ${arr[*]} #输出全部元素 echo "查看下面实例,输出的结果将是welcom,而不会是boobooke;因为在()中的>命令列表,将作为一个子shell来运行" a=welcom (a=boobooke) echo $a
{}代码块,又被称为内部组
cat {a.txt,b.txt} > c.txt
[] test ;[]还可以表示数组元素echo ${arr[*]}
########################################## #[] test #-lt 小于 --less than #-gt 大于 --greater than #-le 小于等于 --less than or equal #-ge 大于等于 --greater than or equal #-ne 不等于 --not equal ########################################## echo "case one:" x=3;y=2 if test $x -lt $y then echo "x < y" else echo "x > y" fi echo "case two:" x=3;y=2 if [ $x -lt $y ] then echo "x < y" else echo "x > y" fi echo "case three:" x=3;y=2 if [ $x -gt $y ] then echo "x > y" else echo "x < y" fi echo "case four:" x=3;y=2 if test $x -gt $y
[]还可以表示数组元素 echo ${arr[*]}
[]还可以表示字符范围 grep ^[a-z] /root/anaconda-ks.cfg;过滤以a-z中开头的字符;
[arcerzhang@DG3 shell]$ grep ^[0] c.txt 00000000000000000
>&>>&>>< 重定向
\<,\>正则表达式中的单词边界
[arcerzhang@DG3 shell]$ vi c.txt [arcerzhang@DG3 shell]$ grep '\<chongqing\>' c.txt hello ,this is arcerzhnag!welcome to chongqing; [arcerzhang@DG3 shell]$ vi c.txt [arcerzhang@DG3 shell]$ grep '\<chongqing\>' c.txt hello ,this is arcerzhnag!welcome to chongqing; hello ,this is maryhu!welcome to chongqing too; [arcerzhang@DG3 shell]$
管道.分析前边命令的输出,并将输出作为后边命令的输入
ls -l | grep abc
ps -ef | grep httpd
Ip=ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2}' | awk -F ':''{print:$2}'
&& 与逻辑操作(并且)
make && make install
|| 或逻辑操作
mkdir /root || ls -l 第一个命令如果执行成功,就不会执行第二命令;否则,才会执行第二命令.
&后台云新该命令.一个命令后跟一个&,表示将在后台运行.
sleep 5
sleep 5 &