【问题标题】:Bash re-assignment of value to variable "command not found" [duplicate]Bash将值重新分配给变量“找不到命令”[重复]
【发布时间】:2014-07-25 15:01:27
【问题描述】:

任何想法为什么会发生这种情况?为什么我必须手动显式地重新分配变量,但如果我在变量名中有另一个变量却不能这样做?

脚本:

#!/bin/bash

a_1=1
a_2=1

for temp in 1 2
do
    a_$temp="2"
    echo $((a_$temp))
done

a_1=2
a_2=2
echo $a_1
echo $a_2

输出:

[dgupta@della4 Rates_Of_Quenching]$ ./test.sh
./test.sh: line 8: a_1=2: command not found
1
./test.sh: line 8: a_2=2: command not found
1
2
2

【问题讨论】:

    标签: bash


    【解决方案1】:

    代替:

    a_$temp="2"
    

    用途:

    declare a_$temp="2"
    

    使用动态名称创建变量。

    【讨论】:

      【解决方案2】:

      就 bash 而言,您正在尝试执行命令 'a_1=2',而不是执行分配。您可以使用declare 或其同义词typeset 来解决此问题:

      'a_1=2'                       # bash: a_1=2: command not found
      typeset 'a_1=2' 
      echo $a_1                     # 2
      declare 'a_1=3'
      echo $a_1                     # 3
      

      虽然可以使用declare,但您可能希望利用 bash 数组(从 bash 版本 2 开始就存在)而不是使用带有数字后缀的变量:

      a=(1 1)
      echo ${a[0]}                  # 1
      echo ${a[1]}                  # 1
      for i in 0 1; do a[i]=2; done
      echo ${a[0]}                  # 2
      echo ${a[1]}                  # 2
      

      【讨论】:

      • +1,但是 (a) bash 认为 typeset 已过时(如果需要最大的可移植性,它仍然有它的位置)和 (b) 您包含提示字符串 (bash-4.3$)两者都会产生视觉噪音并使复制粘贴代码以进行验证变得更加困难(说明运行代码的bash 版本是值得称道的,但这可以单独完成,尽管取决于所讨论的功能,说明版本如果很久以前就引入了一项功能,则可能根本不需要)。
      • @mklement0 感谢您的反馈,我已经编辑了答案。
      • 不客气;我实际上是在考虑根本不使用提示字符串(甚至只是$),因为它使复制粘贴任何序列命令变得很麻烦。我知道$ 很诱人,因为它被广泛用于表示提示,而我知道没有同样知名的符号来表示输出(有吗?)。但是,我认为 SO 反转逻辑是有益的:commandsno 前缀,以及 output 的一些指示符。一个 - 不是很优雅 - 解决这个问题的方法是将输出放在 separate 代码 sn-p.
      • @mklement0 我同意你的想法。对于更长的脚本,我通常会单独显示输出。我已经编辑了在 cmets 中显示命令的输出,这至少意味着命令可以直接复制粘贴。
      • 好主意;将输出放在 cmets 中是一种更简单的选择。
      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2014-01-08
      • 2011-01-23
      • 2018-12-18
      • 2020-10-10
      相关资源
      最近更新 更多