请选择 进入手机版 | 继续访问电脑版
切换风格

Sunset glow Snow NewYear London Flowers Wizard California Cloud Sky Lavender City Black Beige Dragon

1万

主题

1万

帖子

3万

积分

金牌会员

Rank: 6Rank: 6

吾爱币
25109
在线时间
9 小时
注册时间
2020-3-25

论坛新星

Shell 编程详解[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
标签:修改 pre 调试 bre span who 类型 bash art
一、概述
  Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。
二、优势
Shell脚本语言的好处是简单、易学、易用,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情通常是创建脚本的重要原则,脚本语言的特性可以总结为以下几个方面:
  1、语法和结构通常比较简单。
  2、学习和使用通常比较简单,
  3、通常以容易修改程序的“解释”作为运行方式,而不需要“编译。
  4、程序的开发产能优于运行效能。
  5、Shell脚本语言是Linux/Unix系统上一种重要的脚本语言,在Linux/Unix领域应用极为广泛,熟练掌握Shell脚本语言是一个优秀的Linux/Unix开发者和系统管理员必经之路。利用Shell脚本语言可以简洁地实现复杂的操作,而且Shell脚本程序往往可以在不同版本的Linux/Unix系统上通用。
三、变量
  1、用户自定义变量
    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:
    a、unset:删除变量
    b、readonly:标记只读变量
    c、export:指定全局变量
fz.gif
#!/bin/bashecho "定义普通变量"CITY=CHENGDUecho "定义全局变量"export NAME=cdeveloperecho "定义只读变量"readonly AGE=21echo "打印变量的值"echo $CITYecho $NAMEecho $AGEecho "删除 CITY 变量"unset CITY# 不会输出 CHENGDUecho $CITY

运行结果:

定义普通变量定义全局变量定义只读变量打印变量的值CHENGDUcdeveloper21删除 CITY 变量

  2、预定义变量
    预定义变量常用来获取命令行的输入,有下面这些:
    a、$0 :脚本文件名
    b、$1-9 :第 1-9 个命令行参数名
    c、$# :命令行参数个数
    d、$@ :所有命令行参数
    e、$* :所有命令行参数
    f、$? :前一个命令的退出状态,可用于获取函数返回值
    g、$$ :执行的进程 ID
    编辑脚本1.sh

#!/bin/bashecho "print $"echo "1、打印脚本文件名$0"echo -e "$0 = $0 n"echo "2、打印第一个命令行参数$1"echo -e "$1 = $1n"echo "3、打印第二个命令行参数$2"echo -e "$2 = $2n"echo "4、打印命令行参数个数$#"echo -e "$# = $#n"echo "5、打印所有命令行参数$@"echo -e "$@ = $@n"echo "6、打印所有命令行参数"echo -e "$* = $*n"echo "7、打印前一个命令的退出状态"echo -e "$? = $?n"echo "8、打印执行的进程ID"echo "$$ = $$"

执行结果:

print $1、打印脚本文件名1.sh$0 = 1.sh2、打印第一个命令行参数1$1 = 13、打印第二个命令行参数2$2 = 24、打印命令行参数个数4$# = 45、打印所有命令行参数1 2 3 4$@ = 1 2 3 46、打印所有命令行参数$* = 1 2 3 47、打印前一个命令的退出状态$? = 08、打印执行的进程ID$$ = 30839

  3、环境变量
    环境变量默认就存在,常用的有下面这几个:
    a、HOME:用户主目录
    b、PATH:系统环境变量 PATH
    c、TERM:当前终端
    d、UID:当前用户 ID
    e、PWD:当前工作目录,绝对路径
    编辑1.sh

#!/bin/bashecho -e "print envn"echo "家目录"echo -e "$HOME=$HOMEn"echo "环境变量"echo -e "$PATH=$PATHn"echo "当前终端"echo -e "$TERM=$TERMn"echo "当前工作目录"echo -e "$PWD=$PWDn"echo "当前用户ID"echo "$UID=$UID"

执行结果

print env家目录$HOME=/root环境变量$PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/application/jdk1.8.0_181/jre/bin:/application/jdk1.8.0_181/bin:/usr/local/rsync/bin:/application/sersync/bin:/root/bin当前终端$TERM=xterm当前工作目录$PWD=/script当前用户ID$UID=0

四、shell 运算
  1、我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
    a、m=$[ m + 1 ]
    b、m=expr $m + 1 # 用 “ 字符包起来
    c、let m=m+1
    d、m=$(( m + 1 ))
    e、实例,编辑1.sh

#!/bin/bashm=1m=$[ m + 1 ]echo $mm=`expr $m + 1`echo $m# 注意:+ 号左右不要加空格let m=m+1echo $mm=$(( m + 1 ))echo $m

执行结果:
2345
  2、文件测试
    a、-d:测试是否为目录(Directory)
    b、-e:测试目录或文件是否存在(Exist)
    c、-f:测试是否为文件(File)
    d、-r:测试当前用户是否有权限读取(Read)
    e、-w:测试当前用户是否有权限写入(Write)
    f、-x:测试当前用户是否有权限执行(eXcute)
    g、实例
[root@wohaoshuai1 script]# [ -d /media/cdrom ] && echo "YES" || echo "no"no
  3、数值比较
    a、-eq:等于
            b、-ne:不等于
            c、-gt:大于
            d、-lt:小于
            e、-le:小于等于
            f、-ge:大于或等于
    g、实例 编辑1.sh

#!/bin/bash[ $(who | wc -l) -eq 2 ] && echo "等于2"[ $(who | wc -l) -ne 2 ] && echo "不等于2"[ $(who | wc -l) -gt 2 ] && echo "大于2"[ $(who | wc -l) -lt 2 ] && echo "小于2"[ $(who | wc -l) -ge 2 ] && echo "大于或等于2"[ $(who | wc -l) -le 2 ] && echo "小于或等于2"

  4、字符串比较
    a、= :字符串内容相同
            b、!=:字符串内容不同,!表示相反的意思
            c、-z:字符串内容为空
            d、-n:字符串内容不为空

[root@wohaoshuai1 script]# echo $a1[root@wohaoshuai1 script]# [ $a = "b" ] && echo "a等于b" || echo "a不等于b"a不等于b[root@wohaoshuai1 script]# [ $a != "b" ] && echo "a不等于b" || echo "a等于b"a不等于b[root@wohaoshuai1 script]# [ -z $a ] && echo "a为空" || echo "a不为空"a不为空[root@wohaoshuai1 script]# [ -n $a ] && echo "a不为空" || echo "a为空"a不为空

  5、逻辑测试
    a、-a 或 && : 逻辑与,“而且” 的意思
            b、-o 或 || : 逻辑或,“或者” 的意思
            c、! :逻辑否
  6、[] 与 [[]] 区别
    a、[[]] 用 "&&" 而不是"-a" 表示逻辑与,用"||"而不是"-o"表示逻辑或。
[root@wohaoshuai1 ~]# [[ 1 < 2 && b > a ]] && echo "true" || echo "false"true[root@wohaoshuai1 ~]# [[ 1 < 2 -a b > a ]] && echo "true" || echo "false"-bash: syntax error in conditional expression-bash: syntax error near `-a

    b、[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符”>” 与” a ] && echo "true" || echo "false"true    c、[[ ... ]]进行算术扩展,而[ ... ]不做

[root@wohaoshuai1 ~]# [[ 99+1 -eq 100 ]] && echo "true" || echo "false"true[root@wohaoshuai1 ~]# [ 99+1 -eq 100 ] && echo "true" || echo "false"-bash: [: 99+1: integer expression expectedfalse[root@wohaoshuai1 ~]# [ $((99+1)) -eq 100 ] && echo "true" || echo "false"true

    d、[[]]能用正则,而[]不行,并且[[]]在正则匹配中不能使用双引号。
[root@wohaoshuai1 ~]# [[ "test.php" = *.php ]] && echo "true" || echo "false"true[root@wohaoshuai1 ~]# [ "test.php" = *.php ] && echo "true" || echo "false"false[root@wohaoshuai1 ~]# [[ "test.php" = "*.php" ]] && echo "true" || echo "false"false
五、shell 语句
  1、if 语句
    a、这个跟高级语言的 if - else - if 类似,只是格式有些不同而已。

#!/bin/bashread -p "请输入整数:" VARTif [ $VART -eq 10 ];then echo "true"elif [ $VART -gt 10 ];then echo "大于10"else echo "false"fi

执行结果:

[root@wohaoshuai1 script]# sh 1.sh请输入整数:1false[root@wohaoshuai1 script]# sh 1.sh请输入整数:10true[root@wohaoshuai1 script]# sh 1.sh请输入整数:100大于10

  2、case语句,case 语句有些复杂,要注意格式

#!/bin/bashread -p "请输入一个字符,并按enter结束:" keycase "$key" in [./]|[a-z]|[A-Z]) echo "你输入的是字母" ;; [0-9]) echo "你输入的是数字" ;; *) echo "你输入的是空格,功能键或其他控制字符"esac

执行结果:

请输入一个字符,并按enter结束:a你输入的是字母[root@wohaoshuai1 script]# sh 1.sh请输入一个字符,并按enter结束:.你输入的是字母[root@wohaoshuai1 script]# sh 1.sh请输入一个字符,并按enter结束:/你输入的是字母

  3、for循环
<div class="code">
#!/bin/<span style="color: rgba(0, 0, 0, 1)">bash# 普通 <span style="color: rgba(0, 0, 255, 1)">for<span style="color: rgba(0, 0, 0, 1)"> 循环<span style="color: rgba(0, 0, 255, 1)">echo <span style="color: rgba(128, 0, 0, 1)">"<span style="color: rgba(128, 0, 0, 1)">普通for循环如下:<span style="color: rgba(128, 0, 0, 1)">"<span style="color: rgba(0, 0, 255, 1)">for ((i = <span style="color: rgba(128, 0, 128, 1)">1; i




上一篇:Linux系统用户角色划分
下一篇:二.Linux基础入门和帮助
回复

使用道具 举报

228

主题

3075

帖子

6378

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3303
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 7 天前 | 显示全部楼层
打酱油的人拉,回复下赚取积分
回复

使用道具 举报

219

主题

3061

帖子

6344

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3283
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 5 天前 | 显示全部楼层
鄙视楼下的顶帖没我快,哈哈
回复

使用道具 举报

231

主题

2959

帖子

6149

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3190
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 5 天前 | 显示全部楼层
非常好,顶一下
回复

使用道具 举报

206

主题

3020

帖子

6246

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3226
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 4 天前 | 显示全部楼层
楼下的接上
回复

使用道具 举报

49

主题

2863

帖子

5775

积分

金牌会员

Rank: 6Rank: 6

吾爱币
2912
在线时间
0 小时
注册时间
2020-7-7
发表于 3 天前 | 显示全部楼层
……
回复

使用道具 举报

232

主题

3093

帖子

6418

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3325
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 前天 01:31 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊
回复

使用道具 举报

226

主题

3013

帖子

6252

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3239
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 前天 17:06 | 显示全部楼层
广告位,,坐下看看
回复

使用道具 举报

241

主题

3114

帖子

6470

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3356
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 昨天 07:40 | 显示全部楼层
看起来不错
回复

使用道具 举报

248

主题

3085

帖子

6418

积分

金牌会员

Rank: 6Rank: 6

吾爱币
3333
在线时间
0 小时
注册时间
2020-6-28

论坛新星

发表于 昨天 18:52 | 显示全部楼层
没人回帖。。。我来个吧
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|吾爱分享-享你所想 ( 黔ICP备18007665号-2 )|网站地图

GMT+8, 2021-1-20 18:58 , Processed in 3.019909 second(s), 74 queries .

Powered by 52Fenxiang.Top

© 2001-2020 Comsenz Inc.

返回顶部