shell脚本学习笔记之常见语法结构用法
一,变量
1.变量赋值和替换
语法:variable=value
variable=“value1 value2”
echo $variable/$"{variable}" 屏幕上显示赋值
echo $"{variable+b}" 将已经赋值的变量重新设值,临时生效
echo $"{variable:=value} 屏幕上显示value(前提是value没有被赋值)
echo $"{variable:-value} 屏幕上显示value(value未被赋值,value临时赋值)
echo $"{variable?}" 用于查看变量是否被赋值,赋值是什么
设置只读变量(查看所有的只读变量用readonly即可)
variable=value
readonly=value 任何用户不允许对变量variable重新设置变量或unset变量
declare/typeset
2.无类型shell变量
*****shell不需要声明变量类型,通过上下语句来自动识别,只支持整型和字符型
默认为字符型,如果没有给变量赋值而带入到语句中,会根据上下文自动给变量赋值,默认为空(字符),如果上下文分析出为一个算法,
则将变量赋值为0
3.环境变量
3.1定义和清除变量
定义环境变量的基本格式
ENVIRON-VARIABLE=value
声明环境变量
export ENVIRON-VARIABLE
例子:
[root@node1 ~]# export APP
[root@node1 ~]# echo "APP"
[root@node1 ~]# echo "$APP"
/usr/local
查看所有的环境变量 env
unset清除环境变量
3.2 重要环境变量
PWD/OLDPWD
在PATH中添加新目录
export PATH="/new directory":$PATH
HOME
echo $HOME 显示当前用户的家目录
SHELL
USER和UID 当前用户
PPID 进程号
PS1和PS2
IFS 指定域分隔符
3.环境变量配置文件
.bash_profile 作用于用户登录后启动的shell(可以执行配置文件中登录后的命令)
.bashrc 作用于子shell(子shell中使用的命令,)
.bash_logout 作用于注销时执行配置文件中的命令
父进程 子进程
环境变量和本地变量的异同点
环境变量的父shell可以向子shell传递
本地变量的父shell 不能传递
而环境变量和本地变量的子shell都不能向父shell进程传递
_____________________________________________________________________
[root@node1 scripts]# cat father.sh
#!/bin/bash |
#输出父进程号
echo "Father Process ID is $$"
|
#定义本地变量并输出 |
localvar="Define a local variable."
echo "localvar=$localvar" |
#定义环境变量并输出
ENVVAR="Define a environment variable."
export ENVVAR
echo "ENVVAR=$ENVVAR"
#调用child.sh脚本,即创建子进程
$PWD/child.sh
#child.sh执行完毕,输出相关变量值
echo "Return to father process: $$"
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
[root@node1 scripts]# cat child.sh
#child.sh:该脚本输出自身进程号及父进程号、重新定义本地变量和环境变量
#!/bin/bash
#输出自身进程号及父进程号
echo "Chile Process ID is $$"
echo "My Father Process ID is $PPID"
#输出本地变量和环境变量的当前值
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
#重新定义本地变量和环境变量
localvar="Redefine this ocal variable."
ENVVAR="Redefine this environment variable."
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
[root@node1 scripts]# ./father.sh
Father Process ID is 5429
localvar=Define a local variable.
ENVVAR=Define a environment variable.
Chile Process ID is 5430
My Father Process ID is 5429
localvar=
ENVVAR=Define a environment variable.
localvar=Redefine this ocal variable.
ENVVAR=Redefine this environment variable.
Return to father process: 5429
localvar=Define a local variable.
ENVVAR=Define a environment variable.
_____________________________________________________________________
4.参数
$N 赋值变量
$# 变量个数
$*/$@ 列出所有变量
$$ 执行的shell进程号
$? 显示是否错误0/1
__________________________________________________
[root@node1 scripts]# ./a.sh a b c d e f j
the scripts is ./a.sh
the part1 #1 a
the part2 #2 b
all parts a b c d e f j
the pats are 7
the error 0
the shell process 4898
[root@node1 scripts]# cat a.sh
#!/bin/bash
echo "the scripts is $0"
echo "the part1 #1 $1"
echo "the part2 #2 $2"
echo "all parts $*"
echo "the pats are $#"
echo "the error $?"
echo "the shell process $$"
_________________________________________________
==========================================================================
二、引用
"" 引用除$,`,\外所有字符
'' 引用所有字符
`` shell解释为系统命令
\ 转义符,即屏蔽下一个字符的特殊意义
1. 全引用和部分引用
”“ ‘’
2.命令替换
`linux命令`
$(linux命令)
需要理解 x y ”x y“
``和$()的区别
3.转义符
在使用echo时
$''=-e
a=1
a="1 2”
**************************************************************************
$?
0表示运行成功
非0表示失败
echo $? 0或其他------ 用于测试判断语句
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三.退出状态
1.测试结构
test
格式:test expression
2.整数比较运算符
整数比较------ 用于测试判断语句或循环语句
-eq
le
ge
lt
gt
ne
3字符串运算符----- 用于测试用户输入是否为空或比较字符串变量
string 测试string是否不为空
-n string 测试是否不为空
-z string 测试是否为空
string1=string2 测试string1和string2是否相等
sring1!=string2 测试string1和string2是否不相等
格式 [ "string1" =/!= string2 ]
4.文件操作符
file 为目录,文件,或文件路径
-d file 测试file是否为目录
-f 测试file是否存在
-r 测试file是否为普通文件
-s 测试file是否是进程可读文件
-w 测试file是否是进程可写文件
-x 测试file是否是进程可执行文件
-L 测试file的长度是否不为0
-e 测试file是否符号链接
格式 [ -d file ]
逻辑运算符
!expression 非 如果为假,则test为真
expression1 -a expression2 与 如果都为真,则test为真
expression1 -o expression2 或 如果有一个为真,则test为真
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三.判断
1.简单的if结构
if expression
then
command
command
...
fi
2.exit命令
exit status
3.if/else结构
if expression1
then
command
...
command
else
command
...
command
fi
4.if/else嵌套语句
if expression1
then
if expression2
then
command
command
...
else
command
command
...
fi
else
if expression3
then
command
command
...
else
command
command
...
fi
fi
5.if/elif/else结构
if expression1
then
command
command
...
elif expression2
then
command
command
...
elif expresionN
then
command
...
command
else
command
...
command
fi
6.case结构
caase variable in
value1)
command
...
command;;
value2)
command
...
comand;;
...
valueN)
command
...
command;;
*)
command
...
command;;
esac
++++++++++++++++++++++++++++++++++++++++++++++++++++
四、运算符
1.算术运算符
运算符 举例 结果
+(加运算) 3+5 8
-(减运算) 5-3 2
*(乘运算) 5*3 15
/(除运算) 8/3 2
%(取余运算) 15%4 3
**(幂运算) 5**3 125
算术复合赋值运算符
运算符 举例 等价表达式
+= v+=5 v=v+5
-= v-10 v=v-10
*= v*=5 v=v*5
/= v/=3 v=v/3
%= v%=5 v=v%5
2.位运算符
运算符 举例 解释或value值
<<(左移) value=4<<2 4左移2位,value值为16
>>(右移) value=8>>2 8右移2位,value值为2
&(按位与) value=8&4 8按位与4,value值为0
|(按位或) value=8|4 8按位或4,value值为12
~(按位非) value=~8 按位非8,value值为-9
^(按位异或) value=10^3 10按位异或3,value值为9
复合运算符
运算符 举例 等价表达式
<<= value<<=2 value=value<<2
>>= value>>=2 value=value>>2
&= value&=4 value=value&4
|= value|=4 vale=value|4
^= value^=3 value=value^3
4.自增自减运算符
++++++++++++++++++++++++++++++++++++
循环
1.列表for循环
for variable in {list}
do
command
command
...
done
2.不带列表for循环
for variable
do
command
command
...
done
3.类c风格的for循环
for(( expr1;expr2;expr3 ))
do
command
command
...
done
++++++++++++++++++++++++++++++++++++++++
while循环
while expression
do
command
command
...
done
1.计数其控制的while
couter = 1
while expression
do
command
...
let command to operate counter
command
...
done
2.结束标记控制的while循环
read variable
while [[ "$variable" != sentinel ]]
do
read variable
done
3.标志控制的while循环
signal=0
while (( singal !=1 ))
do
...
if expression
then expression
signal=1
fi
...
done
4.命令行控制的while循环
while [[ "$*" != ""]]
do
echo "$!"
shift
done
while [[ "$#" -ne 0 ]]
++++++++++++++++++++++++++++++++++++++++++++++++++++++
until循环
until expression
do
command
command
...
done