我想在Linux shell脚本中向用户回显Windows共享文件夹地址,地址是这样的string:\\ hostname \ release \ 1.02A01。 和最后一个string(1.02A01)是一个版本号,它每次运行脚本时都会改变。 我在sh(而不是bash)中尝试了这样的东西,但是它不起作用:
version=$1 # version number are get from the parameter repository="\\\hostname\release\$version" echo $repository # I get this: \hostname\dir$version
这是两个错误:
1)在unix / linux sh中,反斜杠(“\”)必须被转义/在反斜杠(“\”)之前。
2)你正在做INSIDE引号的字符串连接是LITERAL,如果你想要$ version的值,你必须把它放在结尾的引号之外。
我把它放在一个shell(shell1)中,并在“sh”下执行:
sh-4.1# cat shell1 version=$1 repository="\\\\hostname\\release\\"$version echo $repository
这是输出:
sh-4.1# ./shell1 1.02A01 <br> \\hostname\release\1.02A01
为避免需要转义反斜杠,请使用单引号而不是双引号。
repository='\\hostname\release\'"$version"
$version
需要双引号才能使参数展开。 两个彼此相邻的带引号的字符串被连接成一个字符串。
BASH越狱陷阱
也许尝试:
version=`echo $1` repository='\''\hostname\release\'$version
经测试:
〜$猫堆栈
#!/bin/bash string="1.02A01" version=`echo $string` repository='\''\hostname\release\'$version echo $repository
〜$ bash堆栈
\\hostname\release\1.02A01
不要使用echo
来输出文本,而是使用printf
。 echo
命令有几个可移植性问题, printf
函数更容易使用,因为它具有清晰的“打印我的意思”部分 – 格式字符串 – 带有用于替换文本的占位符。
repository="\\\\hostname\\release\\$version" printf '%s\n' "$repository"
您应该保留对最简单的信息位使用echo
,如跟踪消息,甚至根本不使用它。