提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|行业资讯|编辑:龚雪|2015-10-12 15:23:37.000|阅读 595 次
概述:shell脚本可以直接与操作系统内核打交道,从而完成任意复杂的任务,让我们一起来看看shell是如何完成某些特殊复杂的功能的。
#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>
学习linux操作系统最让人着迷的事情莫过于shell脚本编程,这是因为如果要完成某些复杂的功能,单纯地通过GUI操作不可能达到,shell脚本可以直接与操作系统内核打交道,从而完成任意复杂的任务。shell有很多种,最常用的是Bash (Bourne Again Shell),它是Linux操作系统默认的shell环境。
在linux环境中,需要区分一下root用户与一般用户的命令行显示:
//root用户与一般用户显示有一些差异 //root用户命令行以#结尾 root@sparkmaster:~# su zhouzhihu //一般用户命令行以$符号结尾 zhouzhihu@sparkmaster:/root$ exit exit root@sparkmaster:~#
如下图:

现在让我们来编写第一个shell程序吧
root@sparkmaster:~/ShellLearning/chapter09# vi HelloWorld.sh

就两行内容:
#!/bin/bash echo "Hello Shell"
那完成后如果执行shell脚本程序呢?有两种方式,一种是通过sh命令,另外一种是自执行方式。下面给出了具体演示
//完成后直接利用sh命令执行 root@sparkmaster:~/ShellLearning/chapter09# sh HelloWorld.sh Hello Shell //自执行(self execute)方式,由于没有给文件加执行权限,所以执行失败 root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh bash: ./HelloWorld.sh: Permission denied root@sparkmaster:~/ShellLearning/chapter09# ls -l total 4 -rw-r--r-- 1 root root 31 2015-09-30 06:29 HelloWorld.sh //chmod给文件加执行权限 root@sparkmaster:~/ShellLearning/chapter09# chmod a+x HelloWorld.sh //再通过自执行方式 root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh Hello Shell root@sparkmaster:~/ShellLearning/chapter09#
前面提到,脚本第一行是#!/bin/bash,它的作用是提示该脚本的执行路径是/bin/bash,对自执行方式有用,自执行方式最终是通过/bin/bash HelloWorld.sh 执行脚本,而利用sh HelloWorld.sh命令执行脚本时,#!/bin/bash 不起作用。
HelloWorld.sh文件中的echo “Hello Shell”是一条语句,一般习惯于一行一条语句,如:
#!/bin/bash echo "Hello Shell" echo "Hello World"
如果要将上述语句放在一行,则需要用;隔开
echo "Hello Shell";echo "Hello World"
echo命令用于输出一行内容(包括行符),后面的输出内容除可以用”“双引号之外,也可以不加,也可以用单引号”例如:
root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World" Hello World root@sparkmaster:~/ShellLearning/chapter09# echo Hello World Hello World root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World' Hello World
这三种方式看上去似乎相同,但其实它们之间还是有差异的,具体如下:
//对于一些特殊字符,双引号可能不会正常输出 root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World!" bash: !": event not found //不带引号的参数不会出现这种情况 root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World!' Hello World! //单引号也能正常输出 root@sparkmaster:~/ShellLearning/chapter09# echo Hello World! Hello World! //不带引号的参数使用如果带特殊字符,两条语句不能放在同一行 root@sparkmaster:~/ShellLearning/chapter09# echo Hello World!;echo Hello bash: !: event not found //不带引号,输出的是变量内容 root@sparkmaster:~/ShellLearning/chapter09# echo $JAVA_HOME /hadoopLearning/jdk1.7.0_67 //双引号,输出的也是变量内容 root@sparkmaster:~/ShellLearning/chapter09# echo "$JAVA_HOME" /hadoopLearning/jdk1.7.0_67 //单引号的话,内容原样输出,不会解析变量值 root@sparkmaster:~/ShellLearning/chapter09# echo '$JAVA_HOME' $JAVA_HOME
前一小节提到$JAVA_HOME,这是配置的JAVA环境变量,这一小节我们将介绍如何进行变量定义,如何配置环境变量。同任何的编程语言一样,变量是用来存储可变数据的,即在程序运行过程中变量中的数据可能随时发生变化。shell脚本中的变量同其它脚本语言一样,在使用时不需要进行类型定义,不管是加引号还是不加引号定义变量,其类型都为String,例如:
//t1为String类型 root@sparkmaster:~/ShellLearning/chapter09# t1="123" root@sparkmaster:~/ShellLearning/chapter09# $t1 123: command not found root@sparkmaster:~/ShellLearning/chapter09# echo $t1 //t1为String类型 root@sparkmaster:~/ShellLearning/chapter09# t1=123 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
上面的变量是我们自己定义的,它具有一定的局部性,例如:
root@sparkmaster:~/ShellLearning/chapter09# t1=123 //在当前进程中能够正常输出内容 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123 //开启一个子进程 root@sparkmaster:~/ShellLearning/chapter09# bash //无内容输出 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 //退出,返回原父进程 root@sparkmaster:~/ShellLearning/chapter09# exit exit //内容又能够正常输出 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
从上面的代码可以看到,自定义变量具有只能在当前进程中使用,当开启子进程时,变量在子进程中不起作用,如果需要父进程中定义的变量在子进程中也能够使用,则需要将其设置为环境变量,环境变量使用export命令进行定义,代码如下:
//采用export命令将t1设置为环境变量 root@sparkmaster:~/ShellLearning/chapter09# export t1 root@sparkmaster:~/ShellLearning/chapter09# bash //子进程中现在可能使用 root@sparkmaster:~/ShellLearning/chapter09# $t1 123: command not found root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
不过,这样定义的环境变量,在命令行窗口关闭或系统重新启动时会丢失,如果需要在机器启动时环境变量就自动生效的话,可以将环境变量定义在~/.bashrc或/etc/profile文件中,其中~/.bashrc只对当前用户(例如当前用户是zhouzhihu,则只对本用户有效),如果想对所有用户都有效,则将其放置在/etc/profile文件中。
下图给出了java、scala语言等环境变量配置演示:

在linux脚本编程中,有几个非常重要的特殊变量,说它特殊是因为它变量无需程序员自己定义,系统默认会帮我们进行初始化等相关操作,常用特殊变量如下:
$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
下面我们举例进行演示:
root@sparkmaster:~/ShellLearning/chapter09# vi SpecialVariable.sh

root@sparkmaster:~/ShellLearning/chapter09# ./SpecialVariable.sh 1 2 3 4
4
./SpecialVariable.sh
1
2
1 2 3 4
1 2 3 4
17138
0
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn




目前业内主流的三大类渲染技术路线包括:HOOPS工程级图形引擎、Unity游戏引擎以及Autodesk Forge云平台。那么,它们之间究竟有何不同?又各自适用于怎样的场景?
Excel 中的切片器是 Excel 最直观的数据筛选和可视化工具之一。本教程将展示如何借助Aspose.cells使用C#在Excel中添加切片器,您还将学习如何以编程方式编辑和更新切片器,以及如何为分析师、数据专家和开发人员打造功能强大的 Excel 工作簿,实现完全掌控 Excel 自动化,并添加交互式筛选器。
近日,欧洲知名企业级前端框架 Vaadin 正式发布了 官方 MCP(Model Context Protocol)服务端,这意味着开发者的 AI 编码助手(如 GitHub Copilot、Claude、Cursor 等)可以实时访问最新的 Vaadin 官方文档,实现精准代码生成与智能指导。
RTF 格式广泛用于文本格式化、字体样式和图片插入,而 PDF(Portable Document Format)则是跨平台文档存储和传输的标准格式,具有高度的兼容性和安全性。本教程将深入介绍如何使用 Spire.Doc for Java 库在 Java 中将 RTF 文件转换为 PDF。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@hmdbvip.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
永利最大(官方)网站