Linux shell 编程

来源:互联网 发布:ubuntu apt get jdk8 编辑:程序博客网 时间:2024/05/29 23:23

一、   编写shell的格式

1 第一行决定使用哪一种shell

Bash:#! /bin/bash

Python:#! /usr/bin/python

不知道解释器的完整路径,可使用whereis 解释器名称(bash)

2 # …… 表示注释

3 正常的程序体

 

二、   source . bash sh ./ 执行脚本有啥区别

1 source xxx.sh 等价于 . xxx.sh: 他们是在父进程中执行的,因此各项操作都会在原本的bash环境下生效。所以通过这两种执行的shell 脚本内的变量,在shell脚本执行完毕之后,也是可以查询的。

 

2 ./ sh 以及 bashxxx.sh :他们是父进程会新开一个子进程,然后,这时候bash环境已经是一个新的bash环境,当子进程结束后,子进程内的变量或操作不会回传到父进程

三、   变量和引用

3.1变量运算符

3.1.1 替换运算符

${var:-word}

var存在且非空,返回var值,否则返回word

${var:+word}

对已赋值的var,重设其值

${var:=word}

var存在且非空,返回var值,否则将var的值赋值为word,然后返回这个值

${var:?word}

如果var存在切非空,返回var值,否则打印

word内容。

[root@localhost nicky]# echo ${endeca?'unknown variable'}

-bash: endeca: unknown variable

[root@localhost nicky]# echo ${endeca:?'unknown variable'}

-bash: endeca: unknown variable

[root@localhost nicky]# endeca="Poweful Search Engine Framework"

[root@localhost nicky]# echo ${endeca:?'unknown variable'}

Poweful Search Engine Framework

root@localhost nicky]# echo ${endeca:='unknown variable'}

Poweful Search Engine Framework

[root@localhost nicky]# echo ${endeca1:='unknown variable'}

unknown variable

[root@localhost nicky]# echo ${endeca1:-'unknown variable'}

unknown variable

[root@localhost nicky]# echo ${endeca2:-'unknown variable'}

unknown variable

 

3.1.2 模式匹配运算符

变量运算符

说明

${var#pattern}

如果模式匹配变量的开始处,则删除匹配最短部分

[root@localhost nicky]# echo ${var#/*}

opt/endeca/log/file.log

[root@localhost nicky]# echo ${var#/opt}

/endeca/log/file.log

${var##pattern}

如果模式匹配变量的开始处,则删除匹配最长部分

[root@localhost nicky]# echo ${var##/opt}

/endeca/log/file.log

[root@localhost nicky]# echo ${var##/*/}

file.log

${var%pattern}

如果模式匹配变量的结尾处,则删除匹配最短部分

[root@localhost nicky]# echo ${var%*.log}

/opt/endeca/log/file

${var%%pattern}

如果模式匹配变量的结尾处,则删除匹配最长部分

${var/pattern/string}

${var//pattern/string}

1匹配模式最长的部分替换为string

2匹配模式所有匹配部分替换为string

[root@localhost nicky]# echo -e ${path//:/'\n'}所有:替换成换行

 

3.2变量类型

3.2.1用户变量

用户变量:在shell 脚本定义的变量,分为全局变量和本地变量

默认情况下,都是全局变量,除非显示声明类型是local的,才是局部变量。

语法:varname=value

注意:正确的赋值和变量替换方式

正确:[root@localhost nicky]# str="how are you"

正确:[root@localhost nicky]# str=hello

错误:[root@localhost nicky]# str=hello world

错误:[root@localhost nicky]# str = hello

错误:[root@localhost nicky]# str = "how are you"

报错:-bash: are: command not found

原因:赋值可以不加引号,但是只能是没有空格的字符;如果有空格必须,用双引号引起来;而且=两边不能有空格

删除变量:unset 变量名称

3.2.2位置变量

位置变量即所谓的位置参数:

$0:命令名称

$*:所有的位置参数,不包括$0

$#:未知参数的个数

3.2.3环境变量

环境变量的值适用于所有由登录进程所产生的子进程,定义环境变量的基本格式:

ENVRION-VARIABLE=VALUE #赋值

Export ENVRION-VARIABLE #声明环境变量

四、   测试 退出 判断 操作符

4.1 测试

语法格式:test expression

4.1.1整数比较运算符:

-eq: 等于

-ge: 大于或者等于

-le: 小于或者等于

-gt: 大于

-lt: 小于

-ne: 不等于

4.1.2 字符串比较运算符:

String: string 是否不为空

-n string: string 是否不为空

-z string: string 是否为空

Str1=Str2: str1 是否等于str2

Str1!=Str2: str1 是否不等于str2

4.1.3 文件操作符:

-e file: 文件是否存在

-d file: 文件是否为目录

-f file: 文件是否为普通文件

-r: 文件是否可读

-w: 文件是否可写

-x: 文件是否可操作

-h|-L: 文件是否是连接文件

-s: 该文件是否存在,且为非空白文件

-S: 是否为Socket文件

-nt: 前面的文件是否比后面的文件新

-ot: 前面的文件是否比后面的文件旧

4.1.4 逻辑运算符:

!exp: 是否为false

-a: 表示且

-o: 表示或

4.2 判断

4.2.1 if 判断

if(exp1) then

   statement……

elif(exp2) then

   statement……

else

   statement……

fi

 

4.2.2 exit

语法:exit status

Status:0-255 之间的数字表示,一般返回该状态的值的同时伴随着脚本的退出,参数被保存到shell变量$?中。

#! /bin/bash

echo -e "input a string:"

read str1

if [ -z "$str1" ] # ; then

then

    echo "what you input is null!";

    exit 1;

fi

4.2.3 case

case variable in

var1)

……command……

;;

var2)

……command……

;;

*)

……command……

;;

esac

五、循环与结构化变量

5.1 for循环

5.1.1 列表for循环

for variable in {list}

do

   statements......

done

 

5.1.1 不带列表for循环,由用户指定参数和参数个数

for variable

do

   statements......

done

 

5.1.1 c类for循环

for ((exp1; exp2; exp3))

do

   statements......

done

 

5.2 while 循环

5.2.1 计数器控制的while循环

int x=5;

while (("$int" <=  5))

do

   echo "$int"

   let "$int++"

done

 

5.2.1 结束标记控制的while循环

echo "please input the num[1-10]:"

read num

while[[ "$num" != 4 ]]

do

   if [ "$num" -lt 4 ]; then

      echo "Too Small, Try Again"

      read num

   elif [ "$num" -gt 4 ]; then

      echo "Too High, Try Again"

      read num

   else

      exit 0

   fi

   echo "You are hit the results!"

done

 

5.2.1 标志控制的while循环

echo "please input the num[1-10]:"

read num

signal=0

while[[ "signal" != 1 ]]

do

   if [ "$num" -lt 4 ]; then

      echo "Too Small, Try Again"

      read num

   elif [ "$num" -gt 4 ]; then

      echo "Too High, Try Again"

      read num

   else

      signal=1

      exit 0

   fi

   echo "You are hit the results!"

done

 

5.2.1 命令行控制的while循环

5.3.until循环,直到满足什么才做某事

i=0

until [[ "$i" -gt 10 ]]

do

   let "s=i*i"

   echo "$i * $i = $s"

   let "i++"

done

 

5.4 select 结构

[root@localhost nicky]# cat > 04.sh << "end"

> #! /bin/bash

> echo "what is you like color?"

> select color in "red" "blue" "black" "green" "orange" "others"

> do

>     break

> done

> echo -e "you have selected $color"

> end

[root@localhost nicky]# chmod 777 04.sh

[root@localhost nicky]# ./04.sh

what is you like color?

1) red

2) blue

3) black

4) green

5) orange

6) others

#? 3

you have selected black

[root@localhost nicky]#

 

 

0 0
原创粉丝点击