shell的琐碎命令学完以后,开始shell的各种语法这个判断哪个判断的,当时学的时候虽然痛苦但是很高兴,因为自己在写程序,不知道大家有没有这个感觉呢!嘿嘿。。shell编程里各种语法的使用_表达式






运算符号 + - * / %取余数 (( ))在这里面不需要取消特殊含义 [ ] ( )放到当前shell里的子shell

运算命令 let expr

echo `expr $a + $b`


-------------------------------------------------

流程控制

exit 退出脚本


分支 结构

--------------------

单分支

if 条件表达式;then

语句块

。。。。

fi


---


if 条件表达式

then

语句块

。。。。

fi

------------------

查看htpd 是否启动的脚本 (单分支的)

1 #!/bin/bash

2 service httpd status &> /dev/null

3 if [$? -eq 0 ]; then

4 echo "httpd is running!!"

5 fi

6 echo "script over!!"



查看状态

[root@zjy ~]# netstat -utnalp | grep httpd



---------------------

双分支


单分支

if 条件表达式;then

语句块

。。。。

else

语句块

。。。。

fi


-------------------

1 #!/bin/bash

2 service httpd status &> /dev/null

3 if [$? -eq 0 ]; then

4 echo "httpd is running!!"

5 else

6

7 service httpd start

8 fi



多分支


-------------


if 条件表达式; then

语句块

elif 条件表达式; then

语句块

else

语句块


fi


-------------

成绩1-100

1-60 差

61-80 良

81-100 优


输入成绩 区分成绩好坏 read -p 键盘输入


1 #!/bin/bash

2 read -p "please your cj: " cj

3 if [ -z $cj ];then

4 echo "清输入你的成绩"

5 exit 3 设一个返回值 零一个脚本可以套入这个脚本 如果这个脚本成功后才可以执行当前脚本 看的是第一个脚本的返回值

6 fi

7 if [ $cj -ge 1 ] && [ $cj -le 60 ];then

8 echo "差!!"

9 elif [ $cj -ge 61 ] && [ $cj -le 80 ];then

10 echo "良!!"

11 elif [ $cj -ge 81 ] && [ $cj -le 100 ];then

12 echo "优秀!!"

13 else

14 echo "清输入你的成绩!"

15 fi


-------------------------

分支里面可以嵌套


1 #!/bin/bash

2 read -p "please your cj: " cj

3 if [! -z $cj ];then

4

5 if [ $cj -ge 1 ] && [ $cj -le 60 ];then

6 echo "差!!"

7 elif [ $cj -ge 61 ] && [ $cj -le 80 ];then

8 echo "良!!"

9 elif [ $cj -ge 81 ] && [ $cj -le 100 ];then

10 echo "优秀!!"

11 else

12 echo "清输入你的成绩!"

13 fi

14 else

15 echo "aaaa"

16 fi


------------------------

循环结构 当有值付变量的时候他就一直执行 ,如果没有他就done了


for 变量 in 变量数值列表


do

循环体


done


----------

1 #!/bin/bash

2 for i in one two three

3 do

4 echo "plj"

5 echo "ppp"

6 echo "333"

7 done

8 echo "aaaaaaaaaaa"


----------

造数工具

seq 100

seq 10 20

每次加几

seq 20 2 30

-------------------

造数工具

echo{1...100}


---------

作一个192.168.1.的网段里那个网络是通的


1 #!/bin/bash

2 i=192.168.1

3 for a in `seq 254`

4 do

5 ping -c 4 $i.$a &> /dev/null

6 if [ $? -eq 0 ];then

7 echo "$i.$a"

8 fi

9 done

----------

加上()


1 #!/bin/bash

2 i=192.168.1

3 for a in `seq 254`

4 do

5 (ping -c 4 $i.$a &> /dev/null

6 if [ $? -eq 0 ];then

7 echo "$i.$a"

8 else

9 echo "$i.$a not"

10

11 fi)&

12 done


--------------------

while 循环 注意不要写成死循环


while 条件表达式


do

语句块


done


------

1 #!/bin/bash

2 i=1

3 while [ $i -le 10 ]

4 do

5 echo $i

6 i=`expr $i+1` 重新复值 下次循环 新值生效

7 done


----

1 #!/bin/bash

2 i=1

3 while [ $i -le 10 ]

4 do

5 echo $i

7 let i++ 和上面等效

8 i=i+1

9 done

-----------------


1 #!/bin/bash

2 i=1

3 while [ $i -le 10 ]

4 do

5 echo $i

6 i=`expr $i + 1`

7 sleep 1 停顿一秒

8 done


-----

批量添加用户

1 #!/bin/bash

2 i=1

3 while [ $i -le 10 ]

4 do

5

6 if [ $i -le 9 ];then

7

8 useradd user0$i

echo user$i | passwd --stdin user0$i &> /dev/null

9 else

10 useradd user$i

11 echo user$i | passwd --stdin user$i &> /dev/null

12 fi

13 let i++

14 done


----------

自己选择指定的用户


1 #!/bin/bash

2 read -p "清输入添加用户的个数" num

3 read -p "清输入用户的前缀" name

4 read -p "清输入用户的密码" pass

5

6 i=1

7 while [ $i -le 10 ]

8 do

9

10 if [ $i -le 9 ];then

11

12 useradd ${name}0$i

13 echo $pass | passwd --stdin ${name}0$i &> /dev/null

14 else

15 useradd $name$i

16

17 echo $pass | passwd --stdin $name$i &> /dev/null

18 fi

19 let i++

20 done


-------------

C语言的循环


for ((初始值;条件;步长 ))

do

循环体


done



-------


1 #!/bin/bash

2 for ((i=1;i<=10;i++ ))

3 do

4 ecjp $i

5 done


---------------------


until 循环 条件表达式不成立的时候循环的 一旦成立就会终止



until 条件表达式


do

语句块

done


---


1 #!/bin/bash

2 i=10

3 until [ $i -lt 0 ]

4 do

5 echo $i

6 let i--

7 done



-------------------

while 里的: 代表永远为真

1 #!/bin/bash

2 while :

3 do

4 echo "plj"

5 sleep 1

6 done


--------------------------------------------------------


变量替换

:- 如果前面的变量有值,则会显示变量的数值,如果没有就会显示后面的数值。


httpd=${HTTPD-/usr/sbin/httpd}

${name:-word} 如果name存在且非null 则返回其值;否则 返回word

用途 如果变量没定义 返回默认值

例子

[root@svr10 ~]# echo ${name:-plj}

plj

[root@svr10 ~]# name=jing

[root@svr10 ~]# echo ${name:-plj}

jing

[root@svr10 ~]# unset name

[root@svr10 ~]# echo ${name:-plj}

plj

[root@svr10 ~]# echo $name


[root@svr10 ~]#


:= 如果前面的变量有值则会显示变量的数值,如果没有就会把后面的数值给前面的空变量里


${name:=word} 如果name存在且非null 则返回他的值;否则 设置他为word 并返回其值

用途 如果变量没定义 给变量赋值

例子

[root@svr10 ~]# name=yaya

[root@svr10 ~]# echo ${name:=plj}

yaya

[root@svr10 ~]# unset name

[root@svr10 ~]# echo ${name:=plj}

plj

[root@svr10 ~]# echo $name

plj

[root@svr10 ~]#


:+ 如果前面的变量有值则会显示后面的数值,如果没有就什么也不显示


${name:+word} 如果name存在且非null 则返回word;否则返回null

用途 测试变量是否定义

例子

[root@svr10 ~]# name=plj

[root@svr10 ~]# echo ${name:+yaya}

yaya

[root@svr10 ~]# unset name

[root@svr10 ~]# echo ${name:+yaya}


[root@svr10 ~]#


:? 如果前面的变量有值则会显示变量的值,如果没有就会出现错误提示并且退出脚本


${name:?word} 如果name存在且非null 则返回返回他的值;否则显示name:word 并退出当前的

命令或脚本 若省略word则显示name: parameter null or not set

用途 捕捉由于变量未定义所导致的错误

例子

[root@svr10 ~]# name=plj

[root@svr10 ~]# echo ${name:?undefined}

plj

[root@svr10 ~]# unset name

[root@svr10 ~]# echo ${name:?undefined}

bash: name: undefined

[root@svr10 ~]# echo ${name:?}

bash: name: parameter null or not set

[root@svr10 ~]#


在脚本里使用:?

[root@svr10 ~]# cat a.sh

#!/bin/bash

name=plj

unset name

echo ${name:?abc}

echo "ok"


[root@svr10 ~]# sh a.sh

a.sh: line 4: name: abc

[root@svr10 ~]# cat a.sh

#!/bin/bash

name=plj

#unset name

echo ${name:?abc}

echo "ok"


[root@svr10 ~]# sh a.sh

plj

ok



截取变量值

${变量名#*/} 从左向右最短匹配删除

${变量名##*/} 从左向右最长匹配删除


例子

[root@localhost shell]# echo $MAIL

/var/spool/mail/root

[root@localhost shell]# echo ${MAIL#*/}

var/spool/mail/root

[root@localhost shell]# echo ${MAIL##*/}

root

[root@localhost shell]#



${变量名%/*} 从右向左最短匹配删除

${变量名%%/*} 从右向左最长匹配删除

例子

[root@localhost shell]# echo $MAIL

/var/spool/mail/root

[root@localhost shell]# echo ${MAIL%/*}

/var/spool/mail

[root@localhost shell]# echo ${MAIL%%/*}


[root@localhost shell]# echo ${MAIL%%/root}

/var/spool/mail

[root@localhost shell]#