相关疑难解决方法(0)

符合POSIX的方法将范围变量扩展到Shell脚本中的函数

是否有POSIX兼容方法将变量的范围限制为声明的函数?即:

Testing()
{
    TEST="testing"
}

Testing
echo "Test is: $TEST"
Run Code Online (Sandbox Code Playgroud)

应打印"测试是:".我已经阅读过declare,local和typeset关键字,但它们看起来并不像POSIX内置函数.

variables shell posix scope function

42
推荐指数
3
解决办法
1万
查看次数

如何使用"cmp"来比较两个二进制文件并找到它们不同的所有字节偏移量?

我希望得到一些Bash脚本循环的帮助,它将显示两个二进制文件之间的所有差异,只使用

cmp file1 file2 
Run Code Online (Sandbox Code Playgroud)

它只显示了我想要使用cmp的第一个更改,因为它给出了一个偏移量,每个更改的行数,但如果你认为有一个更好的命令,我会对它开放:)谢谢

unix bash shell

29
推荐指数
2
解决办法
3万
查看次数

bash函数:将主体括在括号和括号中

通常,使用花括号来定义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.

  • 另一方面,使用括号可能会产生一些严重的不良影响,例如搞乱退出,导致杀死脚本的问题以及隔离变量范围.

bash function curly-braces parentheses

27
推荐指数
3
解决办法
6489
查看次数

实现本地功能

我想要实现的是在函数内创建一个本地函数.同时,本地函数不会覆盖外部函数.下面是一个简单函数和带有参数的嵌套函数的示例,用于说明我的问题.

#!/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 shell sh

14
推荐指数
2
解决办法
2602
查看次数

使用括号而不是大括号定义bash函数体

该脚本演示了如何使用带括号的括号对话来定义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)

bash bash-function

9
推荐指数
2
解决办法
2876
查看次数

bash 上的嵌套函数

我有一个函数希望接收另一个要执行的函数

  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 function

3
推荐指数
2
解决办法
3601
查看次数