提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|行业资讯|编辑:龚雪|2015-10-12 15:23:37.000|阅读 536 次
概述:shell脚本可以直接与操作系统内核打交道,从而完成任意复杂的任务,让我们一起来看看shell是如何完成某些特殊复杂的功能的。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
学习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@pclwef.cn
通过提供强大的3D CAD数据访问工具并适用于桌面、移动和Web的高级环境3D可视化发动机,HOOPS在提升造船设计和制造流程的效率方面发挥了重要作用。
HOOPS Luminate在汽车行业中的应用具有广泛的潜力和深远的影响。它通过提供高效的3D可视化、虚拟装配与拆解、性能分析、客户定制等功能,帮助汽车制造商在设计、生产和销售过程中提升效率、降低成本并提高产品质量。
在不断发展的软件开发世界中,使工具和框架与最新的平台版本保持同步至关重要,欢迎查阅~
全球航运业对国际贸易至关重要,全球 90% 以上的商品通过海运运输。准确监控和控制这些集装箱的移动对于维持高效的供应链至关重要。手动输入集装箱号码是这一程序的关键部分,它带来了相当大的挑战,例如人为错误和效率低下。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢