在 bash 脚本中,declare 和普通变量有什么不同?

lov*_*ing 65 bash shell-script variable

在 bash 脚本中:

我们通过命名来创建变量:

abc=ok
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用 declare

declare abc=ok
Run Code Online (Sandbox Code Playgroud)

有什么不同?

为什么 bash 有这么多方法来创建变量?

Pan*_*dya 47

来自help -m declare

姓名

    declare - 设置变量值和属性。

概要

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

描述

    设置变量值和属性。

    声明变量并赋予它们属性。如果没有给出名称,则显示所有变量的属性和值。

    选项:

      -f
        将操作或显示限制为函数名称和定义
      -F
        只显示函数名(调试时加上行号和源文件)
      -g
        在 shell 函数中使用时创建全局变量;否则忽略
      -p
        显示每个 NAME 的属性和值

    设置属性的选项:

      -a
        使 NAME 索引数组(如果支持)
      -A
        使 NAME 关联数组(如果支持)
      -i
        使 NAME 具有“整数”属性
      -l
        在分配时将 NAME 转换为小写
      -n
        使 NAME 成为对其值命名的变量的引用
      -r
        使名称只读
      -t
        使 NAME 具有 'trace' 属性
      -u
        在分配时将 NAME 转换为大写
      -x
        使 NAME 导出

    使用 ' +' 而不是 ' -' 会关闭给定的属性。

    具有整数属性let的变量在为变量赋值时执行算术评估(请参阅命令)。

    在函数中使用时,declare使 NAME 成为本地的,就像local 命令一样。' -g' 选项禁止这种行为。

    退出状态:
    除非提供无效选项或发生变量赋值错误,否则返回成功。

也可以看看

    重击(1)

执行

    GNU bash,版本 4.3.11(1)-release (i686-pc-linux-gnu)
    版权所有 (C) 2013 Free Software Foundation, Inc.
    许可证 GPLv3+:GNU GPL 版本 3 或更高版本 <http://gnu.org/许可证/gpl.html>


因此,declare用于设置变量值和属性

让我用一个非常简单的例子来展示两个属性的使用:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20
Run Code Online (Sandbox Code Playgroud)

从上面的例子,我想你应该明白declare变量的用法了!这种类型的declare操作在函数、脚本循环中很有用。

另请访问键入变量:声明或排版

  • 您需要知道什么是“属性”才能理解这个答案。它们是变量的属性,如“整数”、“数组”或“只读”。 (2认同)

Gil*_*il' 15

abc=ok为变量赋值abcdeclare abc声明一个名为 的变量abc。两者可以结合为declare abc=ok

在 bash 中,与其他 shell 一样,不需要声明字符串和数组变量,因此declare除非您想传递选项,例如declare -A abc创建abc关联数组或declare -r将变量设为只读,否则不需要声明。但是,在函数内部,declare确实有所不同:它使变量成为函数的局部变量,这意味着函数外部变量的值(如果有)被保留。(除非您使用declare -g,这会使变量不是局部变量;这在与其他选项结合使用时很有用,例如declare -gA在函数中创建全局关联数组。)示例:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"
Run Code Online (Sandbox Code Playgroud)

输出:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f
Run Code Online (Sandbox Code Playgroud)

您可以使用declare内置函数做的另一件事是

declare内置是独一无二的庆典。它受到强烈启发并且非常接近 ksh 的typeset内置函数,并且 bashtypeset作为declare兼容性的同义词提供。(我不知道为什么 bash 不直接调用它typeset)。还有第三个类似的,local,其他方面相同但仅在函数内工作。还有export, 与 , 相同declare -x,也是为了兼容性(与每个 Bourne 风格的外壳)。

  • @0xc0de `export` 存在于 `sh` 的所有变体中。`local` 只存在于 bash 和 zsh 中,`declare` 只存在于 bash 中。`typeset` 存在于 ksh、bash 和 zsh 中。 (2认同)