是否有POSIX兼容方法将变量的范围限制为声明的函数?即:
Testing()
{
TEST="testing"
}
Testing
echo "Test is: $TEST"
Run Code Online (Sandbox Code Playgroud)
应打印"测试是:".我已经阅读过declare,local和typeset关键字,但它们看起来并不像POSIX内置函数.
我希望得到一些Bash脚本循环的帮助,它将显示两个二进制文件之间的所有差异,只使用
cmp file1 file2
Run Code Online (Sandbox Code Playgroud)
它只显示了我想要使用cmp的第一个更改,因为它给出了一个偏移量,每个更改的行数,但如果你认为有一个更好的命令,我会对它开放:)谢谢
通常,使用花括号来定义bash函数来包围正文:
foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
今天在处理shell脚本时大量使用函数时,我遇到的问题是调用函数中调用的名称相同的变量,即那些变量是相同的.然后我发现可以通过将函数内部的局部变量定义为local来防止这种情况:local var=xyz.
然后,在某些时候,我发现了一个线程(使用括号而不是大括号定义bash函数体),其中解释了使用括号来定义函数同样有效:
foo()
(
...
)
Run Code Online (Sandbox Code Playgroud)
这样做的结果是函数体在子shell中执行,这有利于函数具有自己的变量范围,这允许我在没有本地的情况下定义它们.由于具有函数局部范围似乎更有意义,并且比所有变量全局更安全,我立即问自己:
但是,我很快发现了在子shell中执行该函数的一个主要缺点,特别是从函数内部退出脚本不再起作用,而是迫使我在整个调用树中使用返回状态(如果是嵌套函数).这引出了我的后续问题:
(*)我知道(从异常相关的讨论中我偶然发现),有些人认为明确使用错误状态比从任何地方退出要好得多,但我更喜欢后者.
显然这两种风格都有其优点和缺点.所以我希望你们中有些经验丰富的bash用户可以给我一些一般指导:
编辑:从答案的转移
谢谢你的回答,我的脑袋现在对此更加清晰.所以我从答案中得到的是:
坚持传统的花括号,如果只是为了不混淆脚本的其他潜在用户/开发者(如果整个身体被括在括号中,甚至使用括号).
花括号的唯一真正缺点是可以更改父作用域中的任何变量,尽管在某些情况下这可能是一个优点.通过将变量声明为可以很容易地避免这种情况local.
另一方面,使用括号可能会产生一些严重的不良影响,例如搞乱退出,导致杀死脚本的问题以及隔离变量范围.
我想要实现的是在函数内创建一个本地函数.同时,本地函数不会覆盖外部函数.下面是一个简单函数和带有参数的嵌套函数的示例,用于说明我的问题.
#!/bin/bash
usage() #<------------------------------- same function name
{
echo "Overall Usage"
}
function_A()
{
usage() #<--------------------------- same function name
{
echo "function_A Usage"
}
for i in "$@"; do
case $i in
--help)
usage
shift
;;
*)
echo "flag provided but not defined: ${i%%=*}"
echo "See '$0 --help'."
exit 0
;;
esac
done
}
function_A --help
usage
Run Code Online (Sandbox Code Playgroud)
这是输出.
function_A Usage
function_A Usage
Run Code Online (Sandbox Code Playgroud)
但我想要的是
function_A Usage
Overall Usage
Run Code Online (Sandbox Code Playgroud)
是否可以在不改变其(功能)名称和顺序的情况下实现?请?
注意:我尝试了local usage()但似乎不适用于功能.
该脚本演示了如何使用带括号的括号对话来定义bash函数.括号具有在函数"local"中创建环境变量的良好效果,我想因为函数体作为子shell执行.输出是:
A=something
A=
B=something
B=something
Run Code Online (Sandbox Code Playgroud)
问题是这是否允许定义函数的语法.
#!/bin/bash
foo() (
export A=something
echo A=$A
)
bar() {
export B=something
echo B=$B
}
foo
echo A=$A
bar
echo B=$B
Run Code Online (Sandbox Code Playgroud) 我有一个函数希望接收另一个要执行的函数
a(){
function=$1
echo "common log! $function"
$function --> run the function
}
Run Code Online (Sandbox Code Playgroud)
我想要的是在我的函数中将该函数参数作为嵌套函数传递
b(){
a f(){ echo "nested function b" }
echo "since I´m doing more things here"
}
c(){
a f(){ echo "nested function c" }
echo "since I´m doing more things here"
}
Run Code Online (Sandbox Code Playgroud)
但似乎嵌套函数 f 不能在 bash 上完成
关于如何实现这一点的任何建议?
bash ×5
function ×3
shell ×3
curly-braces ×1
parentheses ×1
posix ×1
scope ×1
sh ×1
unix ×1
variables ×1