shell 编程基础

(一)shelll 脚本

什么是shell脚本?

简单的说,只要将平时使用的各种linux命令,按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个shell脚本。

shell脚本格式:

#!/bin/bash      //特殊脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行

#这是一个简单的shell脚本    //#开头表示注释信息

cd ~root

touch shell

mv shell shelll

echo 这就是shell脚本的基本格式    //echo用于输出字符串,以使脚本输出信息更容易读懂

shell脚本运行方式

1.给脚本添加可执行权限(x

:chmod +x shell

./shell

2.通过内部命令shsource.

sh -x shell(-x参数,可以查看脚本运行过程)

   source shell

. shell

(二)shell 变量

什么是shell变量

shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化,通过使用变量,shell程序能够提供更加灵活的功能,适应性更强。

set 查看所有shell变量

unset 删除变量(后跟变量名即可)

1.自定义变量(本地变量)

_XIAO=this     //设置自定义变量

  echo _XIAO      //查看自定义变量

注:变量名建议用大写,只能用字母、数字,下划线,而且不能以数字开头

双引号 ""

_XIAO1="$XIAO is cat"     //要包括别的变量,或跟多个单词,必须用""括起来

echo $_XIAO1

this is cat

单引号 ''

   _XIAO2='$XIAO is cat !'    //不能包含变量,里面写什么就是什么

   echo $_XIAO2    

   $XIAO is cat !

反撇号 ``                  

  _XIAO3=`which man`                 //将可执行的命令行的结果,赋值给自定义变量

  echo $_XIAO3

  /usr/bin/man

$()

 _XIAO3=$(rpm -qf $(which man))    //如果要使用多重反撇号,只能用$()表示

 echo $_XIAO3

 man-1.6f-32.el6.x86_64

expr数值变量的运算

注:expr命令对整数型变量进行算术变量

#!/bin/bash

#这是个数值变量运算

VALUE1=10

VALUE2=20

VALUE3=30

A=`expr $VALUE1 + $VALUE2 + $VALUE3`

echo + $A            +

B=`expr $VALUE1 - $VALUE2 - $VALUE3`

echo - $B            -

C=`expr $VALUE1 \* $VALUE2 \* $VALUE3`

echo "\* $C"         \*乘(因为*是通配符,不能当乘法运算符,所以要加转译符\

D=`expr $VALUE1 / $VALUE2 / $VALUE3`

echo / $D            /

read命令:从键盘读入数据,赋给变量

例:

#!/bin/bash

read A B C

echo one is $A

echo two is $B

echo three is $C

sh read.sh         //执行shell脚本

10 20 30          //输入102030

one is 10

two is 20

three is 30

2.环境变量

set 查看当前工作下的环境变量

3.位置变量

将命令行的第一个部分作为命令名,其它部分作为参数。

例:

#!bin/bash

#这是一个位置变量

ls -l $1 $2 $3     //$0为这个程序的命令名即ls -l,$n为这个程序的第n个参数吧,n=1-9

sh wzbl.sh file1 fil2 fil3    //file1file2file3 分别对应$1 $2 $3

4.预定义变量

$* 这个程序的所有参数

$# 这个程序的参数个数

$$ 这个程序的PID

$! 执行上一个命令的PID

$? 执行上一个命令行的返回值   0为这个程序执行正确  非0为不正确

$0 这个程序本身

例:

#!/bin/bash

#this is ydybl

echo '$* is' $*

echo '$# is' $#

echo '$$ is' $$

echo '$! is' $!

echo '$? is' $?

echo '$0 is' $0

echo '$1 is' $1

echo '$2 is' $2

echo '$3 is' $3

echo '$4 is' $4

sh ydybl.sh file1 file2 file3 file4       //执行预定义变量脚本

$* is file1 file2 file3 file4

$# is 4          

$$ is 21155

$? is 0

$0 is tsbl.sh

$1 is file1        //位置变量1file1

$2 is file2        //位置变量2file2

$3 is file3        //位置变量3file3

$4 is file4        //位置变量4file4

(三)条件测试操作

1.test条件表达式

形式一:test 条件表达式

例:

test 5 -ne 6 && echo '5不等于6'

5不等于6

形式二:[条件表达式]

例:

[ 5 -ne 6 ] && echo "5不等于6"

5不等于6

字符串测试:

test xiao = hang 测试字符串是否相等

test xiao != hang 测试字符串是否不相等

test xiao  测试字符串是否不为空

test -n xiao 测试字符串是否不为空

test -z xiao 测试字符串是否为空

整数测试:

test xiao -eq hang 测试整数是否相等

test xaio -ge hang 测试xiao是否>=hang

test xiao -gt hang 测试xiao是否>hang

test xiao -le hang 测试xaio是否<=hang

test xiao -lt hang 测试xiao是否<hang

test xiao -ne hang 测试整数是否不相等

文件测试:

test -d xiao 指定文件是否为目录

test -f xiao 指定文件是否为文件

test -x xiao 指定文件是否是否可执行

test -r xiao 指定文件是否可读

test -w xiao 指定文件是否可写

test -a xiao 指定文件是否存在   或者用-e参数

test -s xiao 文件大小是否非0

逻辑测试:

! 逻辑否(不)

&& -a 逻辑与(而且),-a只能使用test命令测试时才能用

|| -o 逻辑与(或者),-o只能使用test命令测试时才能用(只写一个test就可以)

例:

A=5

test $A -gt 10 || test 1 -lt $A  && echo "符合要求" test $A -gt 10 -o1 -lt $A  && echo "符合要求"

2.单分支if语句

如果结果为“真”就执行一个操作,为“假”什么都不执行

if [条件测试操作]

 then

 命令序列

fi

3.双分支if语句

如果结果为“真”执行一个操作,为“假”再执行一个操作

if [条件测试操作]

then

 命令序列1

else

 命令序列2

fi

4.多分支if语句

if [条件测试操作1]

then

 命令序列1

elif [条件测试2]

then

 命令序列2

else

 命令序列3

fi

例:

#!/bin/bash

#多分支if语句

echo 请输入您的成绩

read A read -p 请输入您的成绩 A

if [ $A -ge 85 ] && [ $A -le 100 ]

then

  echo 您的成绩为,优!

elif [ $A -ge 70 ] && [ $A -le 84 ]

then

  echo 您的成绩为合格!

else

  echo 您的成绩不合格?

fi

() for循环语句

for循环语句语法结构:

for 变量名 in 取值列表

do

命令序列

done

例:

#!/bin/bash

#这是个批量添加用户的脚本

USER=xiao

A=123

for NAME in {1..10}     //变量名为NAME,取值范围为1~10

do

useradd ${USER}$NAME &> /dev/null    //批量添加用户,并把消息给/dev/null

echo "${USER}${NAME}${A}" | passwd --stdin ${USER}$NAME &> /dev/null     //批量设置密码

done

() while循环语句

特殊条件测试操作: while true() while false(假)    //while true 等同于 while :

let XIAO++  使变量XIAO的值增加1(等同于XIAO=`expr $XIAO + 1`

exit 0 退出

break 强制退出

while循环语句语法结构:

while 条件测试操作

do

命令序列

done

例:

ech#!/bin/bash

#猜我生日

D=0

echo "猜猜我生日吧,我是哪一年"

while true    

do

read A

let D++

if [ $A -lt 1993 ]

then

  echo "我有那么老吗?再猜猜看哦! "

elif [ $A -eq 1993 ]

then

  echo "你总共猜了${D}"

  echo "小子,眼力不错嘛?"

  break

else

  echo "我有那么小吗?再猜猜看哦!"

fi

done

()  case分支语句

case 语句的结构:

case 变量值 in

模式1

  命令序列1

;;

模式2

 命令序列2

;;

......

* )        //若找不到任何匹配的值,则执行默认模式

默认命令序列

esac

例:

e#!/bin/bash

#整人的心理测试题

echo " ------------------------------------------------------------"

echo "|这是一道高智商的心里测试题,作者xiaoxiao|"

echo " ------------------------------------------------------------"

echo

echo "做题前要有心理准备哦!"

echo "  你被困在一个孤岛上,船只能载一个人,你需要选择"

echo "A 抢船走人"

echo "B 杀死美女抢船走人"

echo "C 留下美女天天云雨"

echo "D 放走美女自己等死"

echo "请您做出选择,并按Enter键确认"

F=0

G="您可尝试做出别的选择"

while [ $F -lt 4 ]       //while循环体次数,大于4,程序结束

do

 read E

 let F++          

case "$E" in


A)

if [ $F -ne 4 ]           //if双分支语句和case分支语句套用

then

 echo "禽兽!"

echo "$G!"

else

 echo "禽兽!欢迎下次再来哦!"

fi


B)

if [ $F -ne 4 ]

then

 echo "禽兽不如!"

 echo "$G!"

else

 echo "禽兽不如!欢迎回答笑笑问答!"

fi

;;


C)

if [ $F -ne 4 ]

then

 echo "比禽兽还禽兽!"

 echo "$G"

else

 echo "比禽兽还禽兽!欢迎回答笑笑问答!"

fi

;;


D)

if [ $F -ne 4 ]

then

echo "不但不如禽兽,还是个蠢货!"

echo "$G"

else

echo "不但不如禽兽,还是个蠢货!拜拜哦!"

fi  

;;

*)        //默认模式

echo "请您做出正确选择!"

esac        //case 分支语句结束

done       //while 循环语句结束

                     Shell 语法


if 语句

for 循环语句

while 循环语句

case 分支语句










语法格式

if [条件测试操作1]

then

 命令序列1

elif [条件测试2]

then

 命令序列2

else

 命令序列3

fi


for 变量名 in 取值列表

do

命令序列

done


while 条件测试操作

do

命令序列

done


case 变量值 in

模式1

  命令序列1

;;

模式2

 命令序列2

;;

......

* )      

默认命令序列

esac





说明


if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果.......那么......


指定一个变量及可能的取值列表,针对每一个不同的取值,重复执行相同的命令序列,直到变量值用完退出循环


根据特定的条件反复执行一个命令序列,直到改条件不再满足为止


case语句可以使脚本程序的结构更加清晰,层次分明
















适用场合

适用于选择执行的命令语句较多时

适用于列表对象无规律,且列表来源已固定(如某个列表文件)

适用于控制循环次数、操作对象按数字顺序编号,按特定条件执行重复操作

适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,与多分支if 语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同值






小技巧


取值列表中:

[1....9] 表示一个范围

``  直接把命令结果传递给前面变量名

while true()

while false(假)    

while true等同于while :

let XIAO++(等同于XIAO=`expr $XIAO + 1`

exit 0 退出

break 强制退出


模式字符串中:

[0-9]  表示一个连续范围

|    表示A|B


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章