Shell编程注意点 ( by quqi99 )
作者:张华写于:发表于:2011-04-06
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
1
在
shell
脚本中调用另一个脚本的三种不同方式
(fork,
exec, source)
我们先谈谈在
shell
脚本中调用另一个脚本的三种不同方式的区别(
fork,
exec, source )
-
fork
( /directory/script.sh ), fork
是最普通的
,
就是直接在脚本里面用
/directory/script.sh
来调用
script.sh
这个脚本
.
运行的时候开一个
sub-shell
执行调用的脚本,
sub-shell
执行的时候
,
parent-shell
还在。
sub-shell
执行完毕后返回
parent-shell.
sub-shell
从
parent-shell
继承环境变量
.
但是
sub-shell
中的环境变量不会带回
parent-shell
-
exec
(exec /directory/script.sh) exec
与
fork
不同,不需要新开一个
sub-shell
来执行被调用的脚本
.
被调用的脚本与父脚本在同一个
shell
内执行。但是使用
exec
调用一个新脚本以后
,
父脚本中
exec
行之后的内容就不会再执行了。这是
exec
和
source
的区别
-
source
(source
/directory/script.sh)
与
fork
的区别是不新开一个
sub-shell
来执行被调用的脚本,而是在同一个
shell
中执行
.
所以被调用的脚本中声明的变量和环境变量
,
都可以在主脚本中得到和使用
.
可以通过下面这两个脚本来体会三种调用方式的不同
:
1.sh
#!/bin/bash
A=B
echo "PID for 1.sh before exec/source/fork:$$"
export
A
echo "1.sh: /$A is $A"
case $1 in
exec)
echo "using exec…"
exec ./2.sh ;;
source)
echo "using source…"
.
./2.sh ;;
*)
echo
"using fork by default…"
./2.sh ;;
esac
echo
"PID for 1.sh after exec/source/fork:$$"
echo "1.sh:
/$A is $A"
2.sh
#!/bin/bash
echo
"PID for 2.sh: $$"
echo "2.sh get /$A=$A from
1.sh"
A=C
export A
echo "2.sh: /$A is $A"
执行情况:
$
./1.sh
PID for 1.sh before
exec/source/fork:5845364
1.sh: $A is B
using fork by
default…
PID for 2.sh: 5242940
2.sh get $A=B from 1.sh
2.sh:
$A is C
PID for 1.sh after exec/source/fork:5845364
1.sh: $A is
B
$ ./1.sh exec
PID for 1.sh before
exec/source/fork:5562668
1.sh: $A is B
using exec…
PID for
2.sh: 5562668
2.sh get $A=B from 1.sh
2.sh: $A is C
$
./1.sh source
PID for 1.sh before
exec/source/fork:5156894
1.sh: $A is B
using source…
PID
for 2.sh: 5156894
2.sh get $A=B from 1.sh
2.sh: $A is C
PID
for 1.sh after exec/source/fork:5156894
1.sh: $A is C
$
2
函数调用
先看一个例子,执行
mysql
的函数
mysqlExec,
如下:
source
“mysql.conf”
mysqlExec(){
sql=$1
sqlOp=`echo
${sql:0:6}| tr A-Z a-z`
if
[ "$sqlOp" != "select" ]; then
sql=$sql";
select row_count();"
fi
#
use different mysql command depends on the password
if
[ -z $MYSQL_PASSWORD ]
then
$mysql
$MYSQL_DATABASE -h$MYSQL_HOSTNAME -u$MYSQL_USERNAME -se "${sql};"
else
$mysql
$MYSQL_DATABASE -h$MYSQL_HOSTNAME -u$MYSQL_USERNAME -p$MYSQL_PASSWORD
-se "${sql};"
fi
status=$?
if
[ $status -eq 0 ]; then
if
[ "$sqlOp" != "select" ]; then
log
"OK $sql"
fi
else
log
"Occur DB Error, can retry in 3 seconds later -> $sql"
sleep
3
echo
"DB_ERROR"
fi
return
$status
exit
}
函数调用要注意两点:
1
)
函数中可以用
echo,
如上面的
echo
"DB_ERROR"
,在调用时要获取
echo
的值,应该这样
:
campaign=`mysqlExec
"$sql"`
if
[ "x$campaign" == "x" -o "$campaign" ==
"DB_ERROR" ]; then
continue
fi
2)
函数中也可以有返回值,如上面的
return
$status
,
在调用时应该通过
$?
获得,如:
if
[ $? -eq 0 ]; then
echo
“zhanghua”
fi
3
shell
中的要用局部变量很纠结
你会看到
shell
有一个非常大的缺点,就是它在函数调用时,没有局部变量与全局变量之分,如
A
脚本调用
B
脚本中的一个函数,在
B
脚本内部有一个变量
vari
(你可能受
JAVA
影响认为它是局部变量那就大错特错了),如果
A
脚本中也有这个名为
vari
的变量,那么在函数返回时,
B
脚本的那个
vari
变量会将
A
脚本的
vari
变量覆盖,举个例子:
updateWithOptimisticLock(){
rand=$1
campaignId=$2
seq=1
updateVal=-1
status=1
while
[ true ]; do
if
[ $seq -gt 3 ]; then
log
"FATAL ERROR, Update num error, $updatesql"
break
fi
cur=`queryCur
"$campaignId"`
if
[ "$cur" == "DB_ERROR" ]; then
continue
fi
updateVal=$(($cur+$rand))
if
[ "$rand" == "0" ]; then
break
fi
updatesql="update
t_campaign_ set num=$updateVal where campaign_id=$campaignId and
num=$cur"
affectRows=`mysqlExec
"$updatesql"`
if
[ "$affectRows" == "1" ]; then
status=0
break
fi
seq=$(($seq+1))
done
echo
$updateVal
return
$status
}
调用的伪码如下,这时里面的
seq
变量会被上述
updateWithOptimisticLock
函数中的变量
seq
给覆盖,所以在
shell
中没有局部变量一说
seq=1
while
[ $seq -le $cycleNum ]; do
updateFakeNumWithOptimisticLock
$rand $campaignId
done
4
使用
xargs
来传参数
在
shell
中的管道符
|
很强大,可以将前一条命令的标准输出作为下一条命令的标准输入,但是如果下一条命令不是标准输入而是需要传参的话,那怎么办呢,用
xargs
即可,例如下列
shell
中
xargs
命令的
-i
选项告诉
xargs
用前一条命令的标准输出去替换
{}
。
find
. | xargs zgrep "<URL>/Search?" | sed
's/.*q=/([-_*()~.%+0-9A-Za-z]*/).*//1/' | sort -nr | uniq -c | sort
-nr | head -1000 | xargs -i php -r "echo
rawurldecode('{}')./"/n/";" > result.out &
当然
exec
也可以实现上述功能,只是
exec
都是一次性读入内存容易内存溢出,如:
find
. -name "*.m4" -exec grep --color -H "catalina"
{} /;
5
shell
中的
sed
命令使用的正则是缩水版
shell
中的
sed
命令使用的正则引擎和我们
java
中平常所用正则引擎并不一样,功能比较弱。
如上节中的
|
sed 's/.*q=/([-_*()~.%+0-9A-Za-z]*/)
,就是因为
shell
的很多正则不支持,才在使用
sed
命令时用了那么多枚举。
分享到:
相关推荐
MTK平台的多功能下載軟件,適用所有MTK手機....
用directshwo开发的视屏播放器,比较简单,有时候会出错
国内最好的数据库达梦DM8,曲奇网盘下载链接:https://quqi.com/s/1243222/wcOZdaWgUlHrwhOk
核心特性:地形调整的灵活性 地形高度与坡度调整: 利用Terrain Adjust,设计师可以根据需要轻松调整地形的高度和坡度,创造出更加自然和真实的环境。 光滑边缘处理: 工具提供了边缘平滑功能,确保地形调整后的过渡自然,避免了突兀的高低变化。 自定义画笔设置: 可调整画笔大小、衰减、间距等参数,让设计师能够精确控制地形的每一个细节。 应用场景:多样化的地形创作 道路与岩石融合: 利用Terrain Adjust,可以将道路和岩石自然地混合到地形中,为游戏世界增添更多细节。 坡道创建: 工具还支持创建坡道,为游戏中的车辆或其他移动元素提供更加丰富的地形变化。 技术细节:轻量级与高效 编辑器专用: 作为编辑器的专用工具,Terrain Adjust不会对项目造成混乱,保持了工作环境的整洁。 Collider需求: 为了使用Terrain Adjust,目标对象需要有Collider组件,以确保地形调整的准确性。 Terrain Adjust工具以其轻量级设计和强大的地形调整功能,成为了Unity环境设计师的得力助手。它不仅提高了工作效率,还为创造更加丰富和真实的游戏世界提供了可能。
【作品名称】:基于 Shell 的驾照理论考试练习软件的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 测试题数据存储设计 # 测试题目文件夹 # 每个测试题作为一个目录,目录下面必须有 content.txt、options.txt 和 answer.txt 三个文件 # content.txt 文件内容为题目内容 # options.txt 文件内容为题目选项,每个选项占一行 # answer.txt 文件内容为正确答案 export tests_folder='./tests' 复习错题集自动删除答对的错题 export failed_list_file='failed.txt' # 错题集文件 sed -i '' "/$test/d" $failed_list_file
PiP-Tool
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
高分毕业设计源码 基于YOLO的毕业选题设计的程序源码,适用与计算机与软件工程毕业设计选题
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
23230106孙悦1.doc
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
西北工业大学数字逻辑实验三
JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(LW+源代码)JAVA物业管理系统设计与实现(L
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
开发语言:java 框架:springboot,vue JDK版本:JDK1.8 数据库:mysql5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat11+ 开发软件:idea/eclipse(推荐idea)