Shell脚本编程笔记

字号+ 编辑: 国内TP粉 修订: 呆头鹅甲 来源: 雨燕 2018-04-14 23:02 我要说两句(0)

变量

变量的定义

变量名的命名规则

字母、数字、下划线

不以数字开头

变量的赋值,不区分类型,等号两侧不允许出现空格

为变量赋值的过程,称为变量替换

变量名=变量值

a=123

使用let为变量赋值

let a=10+20

使用let可以计算等号右侧的值

将命令赋值给变量

l=ls

将命令结果赋值给变量,使用$()或者``

letc=$(ls -l /etc)

将命令赋值给变量,通过访问变量去执行命令可以节省系统资源开销

变量值有空格等特殊字符可以包含在””或’’中

变量的引用

${变量名}称作对变量的引用

echo ${变量名}查看变量的值

${变量名}在部分情况下可以省略大括号,例如变量名后面没有跟其他字符的时候

变量的作用范围

默认作用范围

定义变量的当前shell

变量的导出

export 变量名

可以使变量在其父进程shell和子进程shell都生效

变量的删除

unset 变量名

删除变量

系统环境变量

环境变量配置文件

数组

定义数组

IPTS=( 10.0.0.1 10.0.0.2 10.0.0.3 )

显示数组的所有元素

echo ${IPTS[@]}

显示数组元素的个数

echo ${#IPTS[@]}

显示数组的第一个元素

echo ${IPTS[0]}

运算符

赋值运算符

= 赋值运算符,用于算数赋值和字符串赋值

使用unset取消为变量的赋值

= 除了作为赋值运算符还可以作为测试操作符

算数运算符

基本运算符

* + - * / ** %

使用expr进行运算

expr 4 + 5

符号左右要有空格,只支持整数,不支持浮点数

num=`expr 4 + 5`

数字常量

let “变量名=变量值”

变量值使用0开头为八进制

变量值使用0x开头为十六进制

双圆括号

(( a=10 ))

(( a++ ))

echo $((10+20))

(( a=4+5 ))

test比较

退出与退出状态

退出程序命令

exit

exit 10 返回10给shell,返回值非0为不正常退出

$?判断当前shell前一个进程是否正常退出

测试命令test

test命令用于检查文件或者比较值

test可以做以下测试

文件测试

整数比较测试

字符串测试

test测试语句可以简化为[]符号

-z STRING

字符串长度为0

STRING1 = STRING2

字符串相等,区分大小写

STRING1 != STRING2

字符串不相等,区分大小写

INTEGER1 -eq INTEGER2

整数1等于整数2

INTEGER1 -ge INTEGER2

整数1大于等于整数2,如果使用>=,需使用[[]]

INTEGER1 -gt INTEGER2

整数1大于整数2,如果使用>,需使用[[]]

INTEGER1 -le INTEGER2

整数1小于等于整数2,如果使用<=,需使用[[]]

INTEGER1 -lt INTEGER2

整数1小于整数2,如果使用<,需使用[[]]

INTEGER1 -ne INTEGER2

整数1不等于整数2

-e FILE

文件存在,不区分文件和目录

-d FILE

文件存在并且是一个目录

-f FILE

文件存在并且是一个普通文件

[]符号还有扩展写法[[]]支持&&、||、<、>

使用if-then语句

if [ 测试条件成立 ] 或 命令返回值是否为0

then 执行相应命令

fi 结束

代码示例:

输出root

[root@localhost ~]# if [ $UID = 0 ]
> then
>     echo root
> fi
root
   

什么也没有输出

[root@localhost ~]# su - vagrant
Last login: 二 10月 22 02:11:36 UTC 2019 from 10.0.2.2 on pts/0
[vagrant@localhost ~]$ if [ $UID = 0 ]
> then
>     echo root
> fi

   

执行

[vagrant@localhost ~]$ if pwd
> then
>     echo success
> fi
/home/vagrant
success

   

未执行

     [vagrant@localhost ~]$ if pwd1
> then
>     echo success
> fi
-bash: pwd1: command not found
   

使用if-then-else语句

使用if-then-else语句可以在条件不成立时也运行相应的命令

if [ 测试条件成立 ]

then 执行相应命令

else 测试条件不成立,执行相应命令

fi 结束

代码示例:

root用户

[root@localhost ~]# if [ $USER = root ] ; then
> echo root user
> echo $UID
> else
> echo other user
> echo $UID
> fi
root user
0

普通用户

[root@localhost ~]# su - vagrant
Last login: Wed Oct 23 03:59:20 UTC 2019 on pts/0
[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> else
>     echo other user
>     echo $UID
> fi
other user
1000


使用if-then-elif-then-else语句可以在条件不成立时也运行相应的命令

if [ 测试条件成立 ]

then 执行相应命令

elif [ 测试条件成立 ]

then 执行相应命令

else 测试条件不成立,执行相应命令

fi 结束

[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> elif [ $USER = vagrant ] ; then
>     echo vagrant user
>     echo $UID
> else
>     echo other user
>     echo $UID
> fi
vagrant user
1000


   

嵌套if语句

if条件测试中可以再嵌套if条件测试

if [ 测试条件成立 ]

then 执行相应命令

if [ 测试条件成立 ]

then 执行相应命令

fi

fi 结束

代码示例:

[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> else
>     if [ $USER = vagrant ] ; then
>         echo vagrant user
>         echo $UID
>     fi
>     echo other user
> fi
vagrant user
1000
other user


分支

case 语句和select 语句可以构成分支

case “$变量” in

“情况1” )

命令…

;;

“情况2” )

命令…

;;

*)

命令…

;;

esac

代码示例:

#!/bin/bash
# demo
case "$1" in
    "START" | "start")
        echo $0 start...
        ;;
    "stop")
        echo $0 stop...
        ;;
    "restart" | "reload")
        echo $0 restart...
        ;;
    *)
        echo "Usage: $0 {start | stop | restart | reload}"
        ;;
esac

循环

使用 for 循环遍历命令的执行结果

for 循环的语法

for 参数 in 列表

do 执行的命令

done 封闭一个循环

使用反引号或$()方式执行命令,命令的结果当做列表进行处理

使用 for 循环遍历变量和文件的内容

列表中包含多个变量,变量用空格分隔

对文本处理,要使用文本查看命令取出文本内容

默认逐行处理,如果文本出现空格会当做多行处理

代码示例:

[root@localhost ~]# touch a.mp3 b.mp3 c.mp3
[root@localhost ~]# for filename in `ls *.mp3`
> do
>     mv $filename $(basename $filename .mp3).mp4
> done


   

C 语言风格的 for 循环

for ((变量初始化;循环判断条件;变量变化))

do

循环执行的命令

done

代码示例:

[root@localhost ~]# for ((i=1;i<=10;i++))
> do
>     echo $i
> done


   

while 循环

while test测试是否成立

do

命令

done

代码示例:

[root@localhost ~]# while [ a -lt 10 ]

do
(( a++ ))
echo $a
done
1


死循环

代码示例:

   [root@localhost ~]# while :
> do
>     echo hello
> done
   

until 循环

until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止

代码示例:

[root@localhost ~]# a=1
[root@localhost ~]# until [ $a -gt 5 ]
> do
>     (( a++ ))
>     echo $a
> done

break 和 continue 语句

循环的使用

循环和循环可以嵌套

循环中可以嵌套判断,反过来也可以嵌套

循环可以使用break和continue语句在循环中退出

代码示例:

break
   [root@localhost ~]# for a in {1..9} ; do
>     if [ $a eq 5 ] ; then
>         break
>     fi
>     echo $a
> done    
continue
   [root@localhost ~]# for a in {1..9} ; do
>     if [ $a eq 5 ] ; then
>         continue
>     fi
>     echo $a
> done

   

使用循环对命令行参数的处理

命令行参数可以使用 $1 $2 … ${10} … $n 进行读取

$0 代表脚本名称

$* 和 $@ 代表所有位置参数

$# 代表位置参数的数量

代码示例:

#!/bin/bash
# demo
# for pos in $*
# do
#     if [ "$pos" = "hello" ] ; then
#         echo $pos $pos
#     fi
# done
while [ $# -ge 1 ]
do
    if [ "$1" = "hello" ] ; then
        echo $1 $1
    fi
    shift
done


函数

自定义函数

函数用于 ”包含“ 重复使用的命令集合

自定义函数

function fname(){
   命令
}

函数的执行

fname

函数作用范围的变量

local 变量名

函数的参考

$1 $2 $3 … $n

代码示例:

#!/bin/bash

# demo
checkpid() {
    local i
    for i in $* ; do
        [ -d "/proc/$i" ] && return 0
    done
    return 1
}

阅完此文,您的感想如何?
  • 鼓掌

    0

  • 鄙视

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • homebrew-core is a shallow clone.

  • 解析Outline链接的加密链接变成明文密码

  • nginx屏蔽指定用户浏览器的方法

  • 用clamscan来给linux主机杀毒扫描病毒

我要说说
网上宾友点评
沙发已空
Shell脚本编程笔记