LInux Shell编程涉及的基本语法。
1、变量和引用
"$"是变量替换符号,如varialbe是变量,则$variable就表示变量的值(有时需要使用${variable})。变量赋值的格式为
variable=value
注意,如果"value"中包含空格,则必须用双引号括起来。
利用unset命令可以清除变量的值,命令格式为
unset 变量名
一种特殊的变量赋值
variable:=value#对未赋值的variable,将value值赋给它
设置变量为只读变量,格式为
variable=value
readonly variable
有一种重要的变量称为环境变量,环境变量不仅在shell编程方面,而且在linux系统管理方面,都起着非常重要的作用。定义环境变量的格式为
ENVIRON-VARIABLE=value
export ENVIRON-VARIABLE#环境变量一般由大写字母组成
source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
位置参数是一种特殊的shell变量,用于从命令行向shell脚本传递参数,$1表示第1个参数,$2表示第2个参数,$0表示脚本的名称,$@表示从$1开始的所有参数。
$#表示传递到脚本的参数数量,$$表示脚本运行的进程号。
shell中定义了4种引用符号,具体说明如下
" ":引用除$、`、\以外的所有字符。
' ':引用所有的字符。
` `:shell将反引号中的内容解释为系统命令。
\:屏蔽下一个字符的特殊意义。
命令替换的基本格式为
`linux命令`
$(linux命令)
2、测试、判断和操作符
测试命令是判断语句和循环语句中条件测试的工具。测试命令用于测试表达式的条件的真假,如果测试的条件为真返回0,为假返回非0(与C语言不同)。
测试命令的格式为
test expression
[ expresstion ]#注意,“[”后和“]"前的空格必不可少
整数比较运算符
num1 -eq num2:如果num1等于num2,测试结果为0。
num1 -ge num2:如果num1大于或等于num2,测试结果为0。
num1 -gt num2:如果num1大于num2,测试结果为0。
num1 -le num2:如果num1小于或等于num2,测试结果为0。
num1 -lt num2:如果num1小于num2,测试结果为0。
num1 -ne num2:如果num1不等于num2,测试结果为0。
字符串运算符
string:测试字符串string是否不为空。
-n string:测试字符串string是否不为空。
-z string:测试字符串string是否为空。
string1 = string2:测试字符串string1是否与字符串string2相同。
string1 != string2:测试字符串string1是否与字符串string2不相同。
文件操作符
-d file:测试file是否为目录。
-e file:测试file是否存在。
-f file:测试file是否为普通文件。
-r file:测试file是否为进程可读文件。
-s file:测试file长度是否不为0。
-w file:测试file是否为进程可写文件。
-x file:测试file是否为进程可执行文件。
-L file:测试file是否为符号化链接。
逻辑运算符
! expression:如果expression为假,则测试结果为真。
expression1 -a expression2:如果expression1和expression2同时为真,则测试结果为真。
expression1 -o expression2:如果expression1和expression2有一个为真,则测试结果为真。
判断语句
#简单if结构
if expression;then
command
command
...
fi
#if/else结构
if expression1;then
command
...
command
else
command
...
command
fi
#if/elif/else结构
if expression1;then
command
command
...
elif expression2;then
command
command
...
elif expressionN;then
command
...
command
else
command
...
command
fi
#case结构
case variable in
value1)
command
...
command
;;
value2)
command
...
command
;;
...
valueN)
command
...
command
;;
*)
command
...
command
;;
esac
算术运算符
+:加。
-:减。
*:乘。
/:除。
%:模。
**:幂。
位运算符
<<:左移。
>>:右移。
&:按位与。
|:按位或。
~:按位非。
^:按位异或。
自增自减操作符(a++、a--、++a、--a)
3、循环与结构化命令
(1)for循环
#列表for循环
for variable in {list}
do
command
...
command
done
#不带列表for循环(有命令行提供参数)
for variable
do
command
...
command
done
#类C风格的for循环
for(( expr1;expr2;expr3))
do
command
...
command
done
(2)while循环
while expresstion
do
command
...
command
done
(3)until循环
until expression
do
command
...
command
done
循环控制符
break:退出本层循环。
continue:结束本轮循环进入下轮循环。
(4)select结构
select结构用于交互式菜单显示
select variable in {list}
do
command
...
command
break
done
4、变量的高级用法
字符串处理
expr length $string:计算字符串长度。
expr index $string $substring:在字符串string上匹配substring中字符第一次出现的位置。
expr match $string $substring:在字符串string开头匹配substring字符串。
expr substr $string $position $length:在字符串string上从position处开始抽取长度为length的子串。
expr match $string '\($substring\)':利用正则表达式在开头抽取字串,使用正则表达式只能抽取string开头或结尾处的子串。
expr match $string '.*\($substring\)':利用正则表达式在结尾抽取字串,使用正则表达式只能抽取string开头或结尾处的子串。
${string#substring}:删除string开头处与substring匹配的最短子串。
${string##substring}:删除string开头处与substring匹配的最长子串。
${string%substring}:删除string结尾处与substirng匹配的最短子串。
${string%%substring}:删除string结尾处与substirng匹配的最长子串。
${string/substring/replacement}:仅替换第一次与substring相匹配的子串。
${string//substring/replacement}:替换所有与substring相匹配的子串。
${string/#substring/replacement}:替换string开头处与substring相匹配的子串。
${string/%substring/replacement}:替换string结尾处与substring相匹配的子串。
declare用于指定变量的类型,格式为
declare [选项] 变量名
declare命令的选项及其意义
-r:将变量设置只读属性。
-i:将变量定义为整型数。
-a:将变量定义为数组。
-x :将变量声明为环境变量。
间接变量引用,如有
variable1=variable2
variable2=value
则tempvar=${!variable1}
bc运算器
在脚本中调用bc运算器的一般格式为
variable=$(echo "options;expresstion" | bc)
举例如下
var4=$(echo "scale=5;$var3*$var4" | bc)
5、I/O重定向
shell编程中管道符号是“|”,命令之间利用管道进行通信的一般格式为
command1 | command2 | command3 | ... | commandn
基本I/O重定向符号及其意义
cmd1 | cmd2:管道符,将cmd1的标准输出作为cmd2的标准输入。
>filename:将标准输出写到文件filename中。
<filename:将文件filename的内容读入到标准输入当中。
>>filename:将标准输出写到文件filename中,若filename文件已存在,则将标准输出追加到filename已有内容之后。
n>filename:将FD为n的输出写到文件filename中。标准错误为2。
n<filename:将文件filename的内容读到FD n中。
n>>filename:将FD为n的输出写到文件filename中,若filename文件已存在,则将FD为n的输出追加到filename已有内容之后。标准错误为2。
<<delimiter:此处文档。delimiter为分界符。shell将分界符delimiter之后直至下一个delimiter之前的所有内容作为输入。
高级I/O重定向符号及其意义
n>&m:将FD为m的输出复制到FD为n的文件。
n<&m:将FD为m的输入复制到FD为n的文件。
n>&-:关闭FD为n的输出。
n<&-:关闭FD为n的输入。
&>file:将标准输出和标准错误输出重定向到文件。
代码块重定向
代码块输入重定向符号是“<”,输出重定向符号是“>”。
6、函数
linux shell函数的基本格式为
function function_name()
{
command1
command2
...
commandN
}
注意,函数名中至少含有一条命令。
另外调用函数时,函数不用加“()",这一点与C语言不同。
函数的传参
函数的传参通过位置参数,$1、$2...,这个类似于命令行参数。
函数返回值
函数的返回值由return语句返回,表名函数的退出状态,0~255之间的值。
局部变量和全局变量
在函数中声明局部变量使用local关键字,局部变量将局限在函数内部。如果全局变量与局部变量重名,在函数中局部变量将覆盖掉全局变量。
7 、别名、列表和数组
别名的命令关键字是“alias”,命令的基本格式为
alias alias-name='original-command' #注意等号两边不能有空格
删除已设置的别名为
unalias -a #删除所有别名
unalias aliasname #删除指定别名
另外注意,在脚本中若想建立别名,需首先使用shopt -s expand_aliases命令打开expand_aliases选项。alias命令不能在if/then结构、循环和函数等混合型结构中使 用,但是可以使用在混合型结构之外所设置的别名。
列表分为与列表和或列表,分别如下所示
命令1&&命令2&&命令3&&...&&命令n #与命令,从左至右依次执行命令,直到某命令返回FALSE时,与列表执行终止。
命令1||命令2||命令3||...||命令n #或命令,从左至右依次执行命令,直到某命令返回TRUE时,或列表执行终止。
列表执行过程可以用“短路操作”来记忆。
bash shell取得数组值的命令格式
${array[x]}
数组可以不连续赋值,即可以存在未初始化的元素,值为空,且未初始化的元素计算数组长度时不会包含进去。
可以单独赋值,如array[0]="beijing",也可以批量赋值,如array=("beijing" [10]= "shanghai" "changsha")。注意赋值号“=”两边不能有空格。
取得数组的所有元素可以用
${array[@]}
数组还有一个重要的操作:数组链接,用(),举例如下
combine=(${test1[@]} ${test2[@]})
以上是linux shell编程的基本语法。