这个形式变量=$(...)是什么?

这个形式变量=$(...)是什么?

以下是什么意思:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

我对这部分特别感兴趣:

varible=$(...)

我知道括号用于执行子进程,但是如果它们与 一起使用怎么办$

答案1

来自 Bash 手册 ( man bash):

   命令替换
       命令替换允许命令的输出替换
       命令名称。有两种形式:

              $(命令)
       或者
              `命令`

       Bash 通过在子 shell 中执行命令来执行扩展
       环境并将命令替换替换为标准
       命令的输出,删除所有尾随换行符。嵌入式
       换行符不会被删除,但在word过程中可能会被删除
       分裂。命令替换 $(cat file) 可以替换为
       等效但更快 $(< file).

(这适用于所有类似 Bourne 的 shell,即shkshzshbash,并且zsh还能够以这种方式捕获嵌入 NUL 字符的数据)

命令

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

会将脚本所在目录的名称(同时将所有反斜杠更改为正斜杠)分配给变量basedir。输出到标准错误流的任何错误、警告或其他诊断消息仍将显示在终端上($(...)仅捕获命令的标准输出)。

shell 将通过执行最里面的命令替换来启动:

echo "$0" | sed -e 's,\\,/,g'

其输出将作为字符串给出dirname,并且其输出将分配给变量basedir

双引号的作用是确保不会进行分词或文件名匹配,否则当$0(脚本的名称,包括用于执行它的路径)包含空格时,您可能会发现脚本失败或产生奇怪的输出字符或文件名通配字符(例如?*)。

一般来说,总是引用扩展(变量扩展、命令替换和算术扩展)是一个好主意。看这个问题及其答案很好地解释了为什么这是一个好主意。

如果脚本执行为

$ /usr/local/bin/script.sh

则会basedir得到 的值/usr/local/bin

或者,在 Cygwin 上:

$ bash c:\\Users\\Me\\script.sh

然后basedir将得到 的值c:/Users/Me。在这种情况下,命令行上的双反斜杠只是为了从 shell 中转义单反斜杠。$0的实际值为c:\Users\Me\script.sh

另一种不使用dirname,做同样事情的方法echosed

basedir="${0//\\//}"
basedir="${basedir%/*}"

答案2

这意味着跑步里面是什么括号在一个子外壳返回那作为价值,在您的情况下将其分配给varible.

答案3

被叫varible=$(..)命令替换它的意思就是运行 shell 命令并将其输出存储到变量或使用 echo 命令显示回来。例如,显示日期和时间:

echo "Today is $(date)"

并将其存储到变量中:

SERVERNAME=$(hostname)

欲了解更多信息:https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

相关内容