【问题标题】:Bash local variables not overwrittenBash 局部变量没有被覆盖
【发布时间】:2020-01-14 07:49:35
【问题描述】:

我正在尝试创建一个使用 2 个命令行参数的简单 bash 函数。 -v 表示详细程度,-d 表示日期。

我想将详细程度 false 作为默认值,并将今天的日期作为 -d 的默认值。

现在,如果我提供实际的其他值,我的默认值不会被覆盖。这是一个示例输出:

$ cruns -v -d 2019-09-10
2019-09-12
false
if check
test false

日期输出应该是 9 月。第 10 次而不是第 12 次。

这是我的代码:

编辑:我修复了变量赋值 $,但输出仍然没有使用我提供的参数。

cruns(){
        local VERBOSE=false
        local STARTDATE="$(date +"%Y-%m-%d")"

        while getopts "vd:" option; do

        case $option
        in
        v) VERBOSE=true
           ;;

        d) STARTDATE=$OPTARG
           ;;
        esac
    done


        echo $STARTDATE;
        echo $VERBOSE;

        echo "if check"

        if $VERBOSE; then
        echo "test true";#              cjobs $STARTDATE | awk -F"_AS-|_Und|_all" '{a[$1]++} END{for(x in a){print x}}'
        else
    echo "test false";#             cjobs $STARTDATE | awk -F"__|_AS-|_Und|_all" '{a[$2]++} END{for(x in a){print x}}'
        fi
}

编辑:我修复了变量赋值 $,但输出仍然没有使用我提供的参数。 如果这很重要,我将函数存储在我的 bashrc 中,源 bashrc 并从终端调用函数。

在我的 getopts 案例中,我需要进行哪些更改才能使变量填充为提供的命令行参数?

【问题讨论】:

  • bash 变量赋值从不使用等号左侧的 '$'
  • Using getopts inside a Bash function 的可能重复项。这里的关键是你必须让OPTIND 本地化,否则getopts 会变得非常混乱。此外,我建议您对自己的事物使用小写或混合大小写变量(例如 verbose 而不是 VERBOSE),以避免与具有特殊含义的 manu 全大写变量混淆。

标签: bash command-line local


【解决方案1】:

分配给变量名,而不是它的值。 所以是VERBOSE=trueSTARTDATE=$OPTARG

case $option
in
v) VERBOSE=true
   ;;

d) STARTDATE=$OPTARG
   ;;
esac

此外,由于您似乎是在 shell 中使用 crun 命令,因此您需要将包含 cruns 定义的文件 source 放入当前的 shell。

source cruns.sh

【讨论】:

  • 这并没有解决它,我仍然得到与以前相同的输出。是不是因为我使用了局部变量?
  • 你在函数外使用这些变量吗?如果是这样,是的,删除本地声明。
  • 不,我不会将它们用于其他任何用途。我只在函数中声明它们,如果给定参数,想重新分配它们的值,并在 2 行后在同一个函数中使用它们。
  • 查看更新后的帖子,source <file-containing-cruns-def> - 有帮助吗?
  • 在更改后我确实/确实获取了文件(我的 .bashrc)。但输出没有变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多