我需要帮助来理解这几行代码的含义。我需要对实习的 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”。