8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么变量赋值中的空格会在 Bash 中引发错误?

dbruning 1月前

10 0

#!/bin/bashdeclare -r NUM1=5NUM2 =4 # 第 4 行num3=$((NUM1 + NUM2))num4=$((NUM1 - NUM2))num5=$((NUM1 * NUM2))num6=$((NUM1 / NUM2)) # 第 9 行echo \'$num3\'echo $((5**2))echo $...

#!/bin/bash

declare -r NUM1=5
NUM2 =4                # Line 4

num3=$((NUM1 + NUM2))
num4=$((NUM1 - NUM2))
num5=$((NUM1 * NUM2))
num6=$((NUM1 / NUM2))  # Line 9

echo "$num3"
echo $((5**2))
echo $((5%4)) 

我正在使用这个 bash 脚本,当我运行该脚本时,出现了错误

./bash_help 
./bash_help: line 4: NUM2: command not found
./bash_help: line 9: NUM1 / NUM2: division by 0 (error token is "NUM2")
5
25
1

所以我把代码改成这样,错误就消失了。

#!/bin/bash

declare -r NUM1=5
NUM2=4

num3=$((NUM1 + NUM2))
num4=$((NUM1 - NUM2))
num5=$((NUM1 * NUM2))
num6=$((NUM1 / NUM2))

echo "$num3"
echo $((5**2))
echo $((5%4)) 

为什么我们在给变量赋值时不能使用空格?使用空格是为了提高代码的可读性,这是惯例。有人能解释一下吗?

帖子版权声明 1、本帖标题:为什么变量赋值中的空格会在 Bash 中引发错误?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由dbruning在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 清晰度和向后兼容性很少同时存在。POSIX sh 于 1991 年首次发布,其根源可以追溯到 20 世纪 70 年代。正如 Common LISP 是一个丑陋但非常有用的庞然大物,由历史悠久的 LISP 拼凑而成,而 Scheme 又小巧、漂亮,但完全缺乏实用的库生态系统一样,bash 处于这条分界线的前者(古老、丑陋和有用)。

  • 这不是 bash(或更普遍地说,POSIX 系列 shell)中的惯例。

    至于“为什么”,那是因为各种错误的做法都具有有效的含义。如果你做了 NUM2 = 4 一个赋值,那么你就不能不引用 = 其作为文字参数传递。 因此,任何这样的改变都是向后不兼容的 ,而不是被放置在未定义的空间中(POSIX sh 标准的扩展需要存在以避免构成对该标准的违反)。

    NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty string
    NUM2 =4 # runs "NUM2" as a command, with "=4" as its argument
    NUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another
    
  • 在 Bash 中,函数通过空格分隔的单词传递参数。

    来自文档

    \'每个运算符和操作数都必须是单独的参数。\'

    变量赋值有所不同,使用以下语法 name=[value]

    不能在等号周围放置未加引号的空格的原因是 bash 会将其解释为命令。

  • 原因很简单,shell 就是按照这种方式构建的。对于有其他编程语言经验的人来说,这可能毫无意义(如果你将 shell 语法称为“语言”,从某种意义上来说它确实是一种语言)。

    在很多情况下,Shell 脚本可以简单地不引用字符串(只要作为单个字符串的字符序列不包含任何空格或特殊字符)。借助这一点,您可以编写:

     my_command -n -X arg1 arg2
    

    而不是(在某种虚构的伪代码中)

     "my_command" "-n" "-X" "arg1" "arg2"
    

    在大多数语言中,情况都是相反的:文字字符串被引用,这样可以释放“语法空间”以使用没有任何特殊字符的变量(就像 $ 在 shell 脚本中一样)。

    Shell 语法在很多情况下提供了便利,但代价是,在执行其他操作时,便利性(和可读性)会降低。这既是祸害也是祝福。好消息是,如果您拥有一个交互式 shell,您可以 100% 确定您拥有一个可以处理某些(可能不够优雅)程序的解释器。由于其普遍可用性(尽管存在各种风格),shell 是一种非常有用且值得学习的平台。

返回
作者最近主题: