Shell脚本基础语法

一、       编写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脚本执行完毕之后,也是可以查询的。

说白了,source主要是加载环境变量的。

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

[root@coolpay10 ~]# ls -al /usr/bin/sh

lrwxrwxrwx. 1 root root 4 Dec 30 19:25 /usr/bin/sh -> 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?'unknownvariable'}

-bash: endeca: unknown variable

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

-bash: endeca: unknown variable

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

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

Poweful Search Engine Framework

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

Poweful Search Engine Framework

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

unknown variable

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

unknown variable

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

unknown variable

3.1.2 模式匹配运算符

变量运算符

${var#pattern}:

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

echo ${var#/*}

结果为:opt/endeca/log/file.log

echo ${var#/opt}

结果为:/endeca/log/file.log

 

${var##pattern}:

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

echo ${var##/opt}

结果为:/endeca/log/file.log

echo ${var##/*/}

结果为:file.log

 

${var%pattern}

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

echo ${var%*.log}

结果为:/opt/endeca/log/file

 

${var%%pattern}:如果模式匹配变量的结尾处,则删除匹配最长部分

 

${var/pattern/string}

${var//pattern/string}

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

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

echo -e ${path//:/'\n'}所有:替换成换行

3.2 变量类型

3.2.1用户变量

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

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

语法:varname=value

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

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

正确:[root@localhostnicky]# str=hello

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

错误:[root@localhostnicky]# str = hello

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

报错:-bash: are:command not found

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

删除变量:unset 变量名称

3.2.2 位置变量

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

$0: 命令名称

$*: 所有的位置参数,不包括$0,因为$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 youinput 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 arehit 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 arehit 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]#

你可能感兴趣的:(Linux,脚本/shell)