Shell 编程——变量

 变量类型   字符型

                            数值型

                            整数型

                            浮点型

                            布尔型

Shell属于弱类型编程语言——数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

Bash变量类型  环境变量

                                   本地变量

                                   位置变量

                                   特殊变量

本地变量

       引用本地变量${abc}时花括号有时可以省略。若变量后紧跟着其他字符,如${ABC}S,则不能省略。

 

       变量的赋值方式:

              本地变量:VAR=VALUE     作用域为整个bash进程

              局部变量; local VAR=VALUE     作用域为当前代码段

              环境变量: export VAR=VALUE 作用域为当前shell进程及其子进程

 

位置变量:$1,$2……

 

特殊变量:

              $?:保存上一个命令的执行状态返回值,程序状态的返回码0255之间,

                     0表示正确执行,1255都表示错误执行,12127为系统预留。

              $#:参数的个数

              $*:参数的列表

              $@:参数的列表

              $$ :Shell本身的PIDProcessID

撤销变量:unsetVAR

 

查看当前shell中的变量: set

查看当前shell中的环境变量:printevnevnexport

 


 

Shell编程——条件判断

条件测试类型  整数测试

                                   字符测试

                                   文件测试

表达式:[expression ] [[ expression ]] test expression

       注:表达式和[  ]之间一定要有空格

整数比较:

     -eq :测试两个整数是否相等,如[ $A –eq $B ],相等为真,不等为              假。

     -ne : 测试两个整数是否不相等,不相等为真,相等为假。

     -gt : 测试一个整数是否大于另一个,大于为真,小于等于为假。

     -lt : 测试一个整数是否小于另一个,小于为真,大于等于为假。
     -ge:测试一个整数是否大于等于另一个整数,大于等于为真,小             于为假。

     -le:测试一个整数是否小于等于另一个整数,小于等于为真,大                     于为假。

逻辑与:&&

逻辑或:||

例:如果用户user不存在,就添加用户。

#   !id user && useradd user

或者id user  ||  useradd user (注:逻辑与前面为真后面命令不执行)

 

变量命名规则:1只能包含字母、数字和下划线,并且不能以数字                                        开头;

                                 2不应该和系统中已有的环境变量重名

                                 3做到见名知意

例:如果/etc/inittab大于100行,则是大文件。

#!/bin/bash

LINES=`wc–l /etc/inittab`

#echo$LINES

FINLINES=`echo$LINES|cut –d ‘ ’ –f1`

#echo   $FINLINES

[$FINLINES –gt 100 ] && echo “it is a big file !” || echo “it is a small file !”

 

例:如果用户不存在,添加用户并且设定密码;否则,显示用户已           存在。

!id  user1 &&  useradd  user1 &&  echo  “user” |passwd –stdin user1  ||  echo “user1 is existing!”

脚本实现:

#!/bin/bash

read -p "Enter userID: "ID

! id $ID && useradd $ID&& echo $ID | passwd --stdin $ID ||echo "$ID is existing !"

可以加入/dev/null

 

自我练习:

#!/bin/bash

if [$# -ne 2 ];then

     echo ‘参数错误!‘

     exit 3

fi

if [$1 – eq $2 ];then

     echo “$1 等于$2”

exit 4

fi

if [$1 –gt $2 ];then

     echo “$1大于$2”

exit 5

fi

if [$1 –lt $2 ];then

     echo “$1小于$2”

exit 6

fi

 


 

单分支if语句:

                                 if 条件判断 then

                                        statement1

                                        statement2

                                        ……

                                 fi

双分支的if语句:

                                 if 判断条件then

                                        statement1

                                        ……

                                 else

                                        statement2

                                        ……

                                 fi

例:如果用户UID0,那么现实为管理员,否则,现实为普通用户。

#!/bin/bash

NAME=users                                          #改为read –p “ID”NAME 实现交互

If

     [ `id –u $NMAE` -eq 0 ]

then

     echo       “Adminitrator!”

else

     echo“Commonuser!”

fi

增加判断用户是否存在:

#!/bin/bash

read-p "ID:" NAME

if

     [ `id -u $NAME` ]                             #注意要加反引号!或者直接写成  id –u $NAME

then

     if

            [ `id -u $NAME` -eq 0 ]

     then

            echo "Admin"

     else

            echo "Common user"

     fi

else

     echo " This user not exist!"

fi

shell中进行算术运算:1   let   let C=$A+$B

                                               2     $[ $A+$B ]

                                               3     $(($A+$B))

                                               4     exprC=`expr $A+$B`

exit :退出脚本。exit后面可以加数字0-255之间。如果没有定义命

            令状态码,就是exit后面的数字。那么最后执行的命令的状态

            码即为脚本的状态码。

if ……;then如果if后面不加[ ],那么if直接判断状态码,如

                   if     grep ……。

文件测试:

                          -e file:测试文件是否存在

                          -f file:测试文件是否问普通文件

                          -d file:测试指定路径是否为目录

                          -r file:测试文件对当前用户是否有读权限

                          -w file:测试文件对当前用户是否有写权限

                          -x file:测试文件对当前用户是否有执行权限

 

 

例:如果文件不存在则推出脚本

#!/bin/bash


注:if后面为假,则then后面就不执行。所以文件不存在,!取反,则then后面执行

FILE=/etc/inittab

if [ !–e $FILE ];then

echo “NOFILE!”

exit 8

fi

多分支if语句:

                                 if 判断1then

                                        statement1

                                        ……

                                 elif 判断2then

                                        statement2

                                        ……

                                 elif ……

                                 else

                                        statementN

                                 fi

例:输入一个文件路径,测试文件是否存在。

#!/bin/bash

if  [$# -lt 1 ] || [ $# -gt 1 ];then

       echo “NO Parameters !”

       exit  7

fi

      

if     [      -e $1       ];then

       echo        “OK!”

else

       echo        “NO Files !”

fi

 

shift : 轮替后面可加数字,表示轮替多少个

例:

       #!/bin/bash

       echo$1

       shift

       echo$1

执行:./X.sh  1     2

显示结果为:              1

                                   2

若改成shift 2

./X.sh  1 2 3

则显示:      1

                     3

 

 

 

字符测试:

                     == 是否相等,相等为真

                     !=    是否不相等,不相等为真

                     >     大于

                     <     小于

                     -zstring :测试指定字符串是否为空,空则真

                     -nstring  :测试指定字符串是否为不空,不空为真

例:[ `id –n –u$1` == `id –n –g $1`]

 

飞bc:计算器

 scale=N ,表示保留几位精度

例: echo “scale=2;111/22;”|bc

或者 bc<<< “scale=2;111/22;”

 

:传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果保留两位精度。

#!/bin/bash

 echo`bc <<< “scale=2;$!$2$3”`

 

例:传递三个参数给脚本,参数均为用户名,将这些用户的账号信息提取出来放置于/tmp/test中,并且需求每一行行首有行号。

egrep $1|$2|$3” /etc/passwd >>/tmp/a

cat –n /tmp/a > /tmp/test

rm –rf a

 

shell循环:要有进入条件,退出条件:forwhileuntil

 

       1 for 变量 in 列表 do

                     循环体

              done

 

生成列表:{ 1..N}`seq 起始数步进数 结束数`

declare :声明变量类型

              -i:整型

              -x:声明为环境变量

 

例:求1100的和

 

#!/bin/bash

declare  -i SUM=0

for I in {1..100};do

        SUM=$[$SUM+$I]

done

echo “The SUM is :$SUM

 

例:比较三个数的大小

echo -n "Enter three number:"

read a b c

if [ $a -gt $b ];then

 t=$a;a=$b;b=$t;

fi

 

if [ $a -gt $c ];then

 t=$a;a=$c;c=$t;

fi

 

if [ $b -gt $c ];then

 t=$b;b=$c;c=$t;

fi

 

echo "From small to big:$a,$b,$c"

 

例:给每个用户发送hello

#!/bin/bash

for I in `cat /etc/passwd|cut –d: -f1` ;do

       echo“hello,$I”

done

 

例:依次向/etc/passwd中的每个用户问好,并显示对方的shell,只想默认shellbash的用户问好。

#!/bin/bash

for I in `cat /etc/passwd |grep ‘bash‘`;do

       echo"hello `echo $I |cut -d: -f1` your bash"

done

例:添加10个用户user1~user10,密码同用户名,要求只有用户不存在的情况下才能添加

扩展,接受一个参数,参数为add时添加用户,当参数是del时,删除用户,其他参数则退出。

#!/bin/bash

if [ $1 == add];then

for I in{1..10};do

       ! id user$I &&useradd user$I -puser$I

done

 

elif [ $1 == del];then

       for I in {1..10};do

              id user$I >/dev/null &&userdel user$I

       done

else

       echo "paramiter wrong"

fi

例:分别显示当前系统上所有默认shellbash的用户和默认shellnologin的用户,并统计各类shell的用户总数如:there have 3 usersthey name is ……

#!/bin/bash

for I in `grep‘bash‘ /etc/passwd|cut -d: -f1`;do

       A="$A $I"

done

 

       echo "users`grep ‘bash‘/etc/passwd|wc -l`name is $A"

或者直接用把用户名cut出来赋予一个变量得到的结果“user1 user2 user3”,而且没有格式错误。

 

本文出自 “Doove” 博客,请务必保留此出处http://doove.blog.51cto.com/1100940/1652636

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。