shell编程一、变量1.shell脚本基础知识

编译型语言:如c语言解释型语言:shell脚本

shell脚本的本质:shell命令的有序集合。

2.shell编程的基本过程

基本过程分为三步:

构建shell文件:包含任意多行操作系统命令或shell命令的文本文件。——xx.sh赋于shell文件执行权限,==用chmod命令更改权限==。执行shell文件,直接在命令行上调用shell程序

示例:

构建shell文件prog1.sh

data

赋于shell文件执行权限(初始文本文件无执行权限)

chmod 740 prog1.sh
#或者
chmod u+x prog1.sh

执行shell文件

prog1.sh
#结果为
prog1.sh :not found

缘由是:shell在标准搜索路径中找不到prog1.sh4.正确的执行shell文件

./prog1.sh
#结果为
2009年 12月 16日 星期二 14:52:57 CST

3.shell变量

shell容许用户构建变量储存数据,但不支持数据类型(整型,字符passwd命令 w参数,浮点型),将任何赋给变量的值都解释为一串字符Variable=value

参数命令注入_ug消除参数命令_passwd命令 w参数

在这儿插入图片描述

==注意几点:==

变量没有类型

=号两旁不能加空格

变量必须是小写

形参的时侯要用“框上去

Bourneshell有如下四种变量:

passwd命令 w参数_参数命令注入_ug消除参数命令

passwd命令 w参数_ug消除参数命令_参数命令注入

passwd命令 w参数_参数命令注入_ug消除参数命令

ug消除参数命令_passwd命令 w参数_参数命令注入

必须在两位数边写上{},能够正常值一一样。

参数命令注入_ug消除参数命令_passwd命令 w参数

二、shell功能句子

shell程序由零或多条shell句子构成。shell句子包括三类:说明性句子,功能性句子和结构性句子。

**说明性句子**以#号开始到该行结束,不被解释执行功能性句子任意的shell命令,用户程序或其他shell程序结构性句子条件测试句子,多路分支句子,循环句子,循环控制句子等。

ug消除参数命令_passwd命令 w参数_参数命令注入

#!/bin/sh
#
# 本程序说明
#
command_1
command_2     #command_2的语句说明
....

常用功能性句子(命令)

==read==从标准输入读入一行,并形参给前面的变量,其句型为:

read var

把读入的数据全部赋给var

read var1 var2 var3

把读入行中的第一个词组(word)赋给var1,第二个词组赋给var2passwd命令 w参数,…..把其余所有的词赋给最后一个变量。倘若执行read词句时标准输入无数据linux修改文件名,则程序在此逗留等候,直至数据的到来或被中止运行。

#!/bin/bash
echo "input a number:"
read NUM
echo $NUM

在这儿插入图片描述

#!/bin/bash

echo”inputyearmonthday:”

readYMD

echo”Todayis$Y-$M-$D”

ug消除参数命令_参数命令注入_passwd命令 w参数

==expr命令:==算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)和求模(%)等操作。诸如

$expr12+5*3

27

$expr3-8/2

-1

$num=9

$sum=`expr$num*6`

$echo$sum

54

ug消除参数命令_参数命令注入_passwd命令 w参数

!!运算符间用空格分开!!

测试句子

==test句子==

test句子可测试三种对象:

字符串/整数/文件属性

每种测试对象都有若干测试操作符比如:

test "$answer" = "yes"
#变量answer的值是否为字符串yes
test $num -eq 18
#变量num的值是否为整数18
test -d tmp
#测试tmp 是否为一个目录名

字符串测试:

s1=s2测试两个字符串的内容是否完全一样s1!=s2测试两个字符串的内容是否有差别-zs1测试s1字符串的厚度是否为0-ns1测试s1字符串的厚度是否不为0

整数测试:

a-eqb测试a与b是否相等a-neb测试a与b是否不相等a-gtb测试a是否小于ba-geb测试a是否小于相等ba-ltb测试a是否大于ba-leb测试a是否大于等于b

#!/bin/bash
A="how"
B="hoW"
test $A = $B
echo $?   //表示输出前一个语句的结果

在这儿插入图片描述

#!/bin/bash

A=”how”

B=”how”

test$A=$B

echo$?//表示输出前一个句子的结果

相等为0(真)linux系统日志,不等为1(假)

#!/bin/bash

A=”how”

B=”hoW”

test$A=$B

echo$?//表示输出前一个句子的结果

pwd

echo$?

lsfile

echo$?

passwd命令 w参数_参数命令注入_ug消除参数命令

最后lsfile没有,所以结果为2

#!/bin/bash

A=99

B=88

test$A-ne$B

echo$?//表示输出前一个句子的结果

test$A-gt$B

echo$?//表示输出前一个句子的结果

参数命令注入_ug消除参数命令_passwd命令 w参数

在这儿插入图片描述

三、shell分支句子1.条件句子

==if..then…fi==句型结构:

if   表达式
              then  命令表
fi   

#!/bin/bash
if [ $# -ne 1 ]
then   
       echo "usage : $0 filename"
       exit
fi
if ! [ -e  $1 ]
then 
        echo " $1 not exist"
        exit
fi 
if [ -d $1 ]
then
         echo "$1 is a dirextory"
fi

参数命令注入_ug消除参数命令_passwd命令 w参数

if…then..else..fi句子结构为:

if    表达式
then   命令表1
else    命令表2
fi

假如表达式为真,则执行命令表1中的命令,在退出if句子;否则执行命令表2中的句子,在退出if句子。

注意:无论表达式是否为真,都有句子要执行

#!/bin/bash
if [ $# -ne 1 ]
then   
       echo "usage : $0 filename"
       exit
fi
if ! [ -e  $1 ]
then 
        echo " $1 not exist"
        exit
fi 
if [ -L $1 ]
then
         echo "l"
elif [ -d $1 ]
then
         echo "-"
elif [ -b $1 ]
then 
         echo "b"
else
         echo "csp"
fi

passwd命令 w参数_参数命令注入_ug消除参数命令

在这儿插入图片描述

2.多路分支句子

==case…esac==多路分支句子case用于多重条件测试,句型结构清晰自然,

case  字符串变量   in   //case语句只能检测字符串变量
      模式1)
               命令表1  //各模拟中可用文件名元字符,以右括号结束
               ;;
      模式2 | 模式3)
               命令表2
               ;;    //命令表以单独的双分号行结束,退出case语句
.....
模式n)
                命令表n
                ;;     //模式n常写为字符*,表示所有其他模式
esac                    //最后一个双分号行可以省略

判定选择——多路分支句子示例1:

#!/bin/bash
echo -n "please choose (yes | no)?"
read R
case $R in
        yes | Yes |y | Y |YES )
             echo  "yes"
             ;; 
         no)
             echo  "no"
             ;;
         *)
             echo   "wrong"
             #;;
esac

passwd命令 w参数_ug消除参数命令_参数命令注入

判定成绩——多路分支句子示例2:

#!/bin/bash

echo-n”pleasechoose(yes|no)?”

readS

if[$S-lt0-o$S-gt100]

then

echo”noin[0-100]”

exit

fi

G=`expr$S/10`

case$Gin

9|10)

echo”$SA”

;;

6|7|8)

echo”$SB”

;;

*)

echo”$SC”

#;;

esac

ug消除参数命令_passwd命令 w参数_参数命令注入

在这儿插入图片描述

四、shell循环句子1.循环句子for的用法

当循环次数早已晓得或确定时侯,使用for循环句子来多次执行一条或则一组命令,循环体由句子括弧do和done来限定。

格式为:

for    变量名    in   单词表
         do  
                     命令表
          done

变量依次取词组表中的各个词组,每取一次词组,就执行一次循环体中的命令。循环次数由词组数确定。命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。假如词组表是命令行上的所有位置参数时,可以在for

实例代码:

#!/bin/bash
#for I  in `ls /etc`
do  
       echo "$I"
done

passwd命令 w参数_参数命令注入_ug消除参数命令

在这儿插入图片描述

==seq命令==:列举一系列的数字seq起始数字中间份量中止份量

#!/bin/bash
for I in `seq 1 2 10`
do
      echo "$I"
done

passwd命令 w参数_ug消除参数命令_参数命令注入

示例:拷贝当前目录下的所有文件到backup子目录下。使用句型为:./prog5.sh[filename]

#The statement of for ....do...done
if [! -d $HOME/backup ]
then
        mkdir $HOME/backup
fi
flist=`ls`
for file in $flist   //flist的值是ls的执行结果即当前目录下的文件名
do
     if [ $# = 1 ]
     then
             if [ $1 = $file ]   //命令行上有一个参数时
             then
                        echo "$file found" ;  exit
             fi
      else 
             cp $file $HOME/backup
             echo "$file copied"   
      fi
done
echo  ***Backup Completed******           

2.循环句子while的用法

句型结构:

while    命令或表达式
          do
               命令表
          done

while句子首先测试其后的命令或表达式的值,倘若为真,就执行一次循环体中的命令,之后再测试该命令或表达式的值,执行循环体,直至该命令或表达式为假时退出循环。

示例:

#!/bin/bash
I=0
while [ $I -lt 5 ]   //-lt  =  <
do
      I=`expr $I + 1`
      echo -n "input score:"
      read $S
      case `expr $S / 10` in
         9|10)
              echo "A"
              ;;
        6|7|8)
              echo "B"
              ;;
        *)
              echo "C"
              ;;
    esac
    echo "$I"
done

3.循环控制句子

==break和continue==

breakn则跳出n层;continue句子则马上转入近来的一层循环句子的下一轮循环上,continuen则转入近来n层循环句子的下一轮循环上。

用法:prog7整数整数整数…参数个数不确定,范围为1-10个,每位参数都是正整数。

示例:

#!/bin/bash
if [ $# -ne 5 ]
then 
      echo "argument 5"
      exit
fi
for I
do
    if [ `expr $I % 2` -eq 1 ]
    then
         echo "$I"
         else
                break
    fi
done        

若是break的话,跳出整个循环。遇见质数就跳出循环。

参数命令注入_ug消除参数命令_passwd命令 w参数

#!/bin/bash

if[$#-ne5]

then

echo”argument5″

exit

fi

forI

do

if[`expr$I%2`-eq1]

then

echo”$I”

else

continue

fi

done

若是continue的话,跳出当前循环。遇见质数就跳出当前循环,继续执行下边句子

passwd命令 w参数_ug消除参数命令_参数命令注入

五、shell函数1.shell函数调用

函数调用格式:

方式1:
value_name=`function_name  [arg1 arg2 ...]`

函数的所有标准输出都传递给了主程序的变量

方式2:
function_name [arg1 arg2 ...]
echo $?

获取函数的返回状态

获取函数的返回状态——示例:

grep_user()
{
   R=`grep "$1" /etc/passwd | wc -l`
   echo $R
   return $R
}
echo -n "input username:"
read USER
grep_user $USER
RET=$?
if [ $USER -eq 1 ]
then   
       echo "$USER exist"
else
       echo "$USER not exist"
fi

参数命令注入_passwd命令 w参数_ug消除参数命令

若改为不返回值,用变量,函数的所有标准输出都传递给了主程序的变量

grep_user()

R=`grep”$1″/etc/passwd|wc-l`

echo$R

echo-n”inputusername:”

readUSER

RET=`grep_user$USER`

echo”—-return$RET—--“

if[$USER-eq1]

then

echo”$USERexist”

else

echo”$USERnotexist”

fi

参数命令注入_ug消除参数命令_passwd命令 w参数

在这儿插入图片描述

2.函数变量作用域

grep_user()
{
      B=200
      A=100
}
grep_user
echo "end: $A-$B"

结果发觉函数内的变量,居然是全局变量

ug消除参数命令_参数命令注入_passwd命令 w参数

假如我们要局部变量就加一个local

grep_user()
{
      B=200
      local A=100
}
grep_user
echo "end: $A-$B"

在这儿插入图片描述

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复