【问题标题】:Unix Shell - Understanding the use of parenthesis for variablesUnix Shell - 了解变量括号的使用
【发布时间】:2023-04-11 03:55:01
【问题描述】:

我是 Unix Shell 脚本的新手,我对在什么情况下必须使用这些类型的括号感到困惑。 假设abc 是一个由字符串组成的变量。有人可以举例说明如何使用这些括号以及何时应该使用它们吗?

abc $abc ${abc} $(abc) ($abc)

【问题讨论】:

  • 你错过了一些:(($abc))$((abc))$(($abc)) 可能有一些含义,尽管很少有用。试试:abc=1+1; (($abc)); ((abc)); echo $((abc)); echo $(($abc)).

标签: bash shell variables unix parentheses


【解决方案1】:

这是相当粗略的,但应该是一个好的开始:

abc - 可以是变量名的裸词\字符串:abc=123

$abc - 引用名为 abc 的变量

${abc} - 字符串安全变量引用file_${abc}_name.txt

$(abc) - 运行命令abc 并使用它的标准输出代替$(abc)

($abc) - 运行存储在子 shell 中的命令 $abc

假设您在 bash 中阅读 the docs on variablescommand substitutionparameter substitution

【讨论】:

  • ($abc) -- 在子shell中,运行存储在变量abc中的命令。标准通道上的 IO。我不知道您所说的“字符串安全”是什么意思——大括号用于消除变量与以下文本“_name”的歧义
  • @glennjackman 嗯实际上我得到了一个语法错误...hi='echo hi'; echo ($hi)
  • @glennjackman 我的意思是安全的,因为“file_$abc_name.txt”会尝试找到一个名为$abc_name而不是$abc的变量
  • @AndrewWhite:($abc) 取决于上下文。 arr=($abc) 是一个数组赋值。仅当 ( 是命令中的第一个单词时,($abc) 才是复合命令(就像 { $abc;},但您需要更多的大括号标点符号,因为它们不是自定界字符。)
【解决方案2】:

$ 字符用于表示要对后面的术语执行参数扩展。因此,如果外壳读取

abc

它将被解析为一个命令,shell 将尝试执行该命令。

如果外壳看到

$abc

它将对文本 abc 执行 parameter expansion 并有效地替换 abc 的值。

${abc}

还将执行参数扩展。当你有这样的表达式时,括号的使用变得很重要:

${abc}_sometext

$abc_sometext

在第一种情况下,shell 将对abc 执行参数扩展。在第二种情况下,它将在abc_sometext上执行参数扩展

$( 告诉 shell 执行大括号中的内容并执行 command substitution。在这种情况下,$ 不用于parameter expansion。因此,如果 shell 读取以下内容:

$(abc)

shell 将执行abc,它的输出将被替换,并且shell 将尝试执行该字符串。

( 只是将命令分组并在子shell 中执行它们。所以

(abc)

将执行abc,但与$(abc) 不同的是,它不会尝试执行任何命令的输出。例如:

$ $(which ls)
Desktop  Documents  Downloads  Mail  Manjaro  Music  Pictures  Public      Templates  Videos  bin  code  tmp
$ (which ls)
/usr/bin/ls
$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2013-10-17
    • 2011-01-07
    • 2014-05-31
    相关资源
    最近更新 更多