帮助分解bash脚本中的这一行

帮助分解bash脚本中的这一行

我需要帮助来理解这几行代码的含义。我需要对实习的 bash 脚本进行一些更改,由于我今天才开始阅读 bash,所以我很难理解这是什么意思。

node="\\\\$1"

echo $node`echo $2|sed 's/\//\\\\/g'`

提前致谢

答案1

此行在脚本的第一个参数前添加两个反斜杠。每对中的第一个反斜杠转义了第二个反斜杠。

node="\\\\$1"

此行获取上一行的结果,并附加将第二个参数中每个斜杠替换为两个反斜杠的结果。

echo $node`echo $2|sed 's/\//\\\\/g'`

如果你像这样调用你的脚本:

scriptname abc /def/ghi/jkl

那么$node将是“\\abc”,并且会回显以下内容:

\\abc\\def\\ghi\\jkl

和被称为位置参数,代表脚本的第一个和第二个参数。如果您想同时引用所有这些参数(无论有多少个参数,最多为系统允许的上限),则可以$1使用或。$2$@$*

以下是编写这两行代码的更好方法:

node='\\'"$1"

通过在反斜杠周围使用单引号,您无需对其进行转义。在位置参数周围使用双引号可以将其展开。

echo $node$(echo $2 | sed 's|/|\\\\|g')

使用$()反引号代替反引号更易读,它们可以轻松嵌套,并且引号和转义也得到简化。通过使用替代分隔符(在本例中为管道符号),sed您无需转义斜杠,整个内容更易读。在这种情况下,反斜杠仍然需要转义,因为sed是 Bash 而不是 Bash 处理它们。

如果您不熟悉$()(或反引号),它们会执行命令替换,这意味着所包含的命令的输出将被替换到它们的位置。

您可能不熟悉sed。它是一个 Bash(或其他 shell)外部的实用程序,可以获取字符流并对其进行编辑。这里使用的特定命令是,s代表替换。它将使用第二和第三个定界符(通常是斜杠,但您可以使用几乎任何字符)之间的内容替换第一和第二个定界符之间的模式。 是g一个修饰符,它导致全局进行替换(即每次在输入行中出现时)。对每一行输入重复该过程。在您的示例中,只有一行输入 - echo 的输出。

答案2

第一行:node 是从命令行设置的变量。因此,如果你这样做

runme.sh test

node 将等于“\test”。第一个斜杠转义第二个斜杠,将其视为文字斜杠,而不是特殊修饰符。

然后,它将名称中的所有反斜杠替换为两个正斜杠,如下所示

> runme.sh test/ing

\\test\\ing

然后,这很可能由另一个程序解释,该程序会穿透斜线,因此需要有两个斜线。

答案3

目前尚不清楚您难以理解这些行中的哪些部分,因此我将尝试解释我认为棘手的部分。

您正在处理的脚本至少需要两个参数。这些参数在脚本中可以通过名称访问1 美元2美元。在第一行中,第一个反斜杠转义了其后的字符,即第二个反斜杠,因此该对被评估为单个文字反斜杠。第二对反斜杠也是如此。1 美元被替换为脚本的第一个参数的值。如果脚本按以下方式运行

myscript apple banana/cantaloupe

的价值节点将为“\\apple”,不带引号。

执行反引号 (`) 内的命令,然后反引号和括起来的命令将被这些命令的输出替换。该sed命令将其输入流中的每个正斜杠替换为一对反斜杠。由于2美元在这个例子中是“banana/cantaloupe”,那么反引号内的命令的结果将是“banana\\cantaloupe”。第二行的输出是节点与反引号表达式的结果连接,即“\\applebanana\\cantaloupe”。

相关内容