linux shell学习

来源:互联网 发布:mysql insert 死锁 编辑:程序博客网 时间:2024/06/06 03:00

  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编程的基本语法。

原创粉丝点击