通过shell脚本逃脱美元符号的字符串

biu*_*biu 34 bash shell

假设我有一个名为dd.sh的脚本,我就像这样运行它

./dd.sh sample$name.mp4
Run Code Online (Sandbox Code Playgroud)

$1字符串也是如此sample$name.mp4.

echo '$1' // shows $1

echo "$1" // shows sample.mp4
Run Code Online (Sandbox Code Playgroud)

然后如何处理$1,我可以检测是否有一个美元符号参数$1

我想处理字符串sample\$name.mp4或只是检测参数中是否有美元符号$filename

pac*_*lik 54

如您所知,美元符号标志着一个变量.您在键入时必须考虑它.

你可以逃脱美元

./dd.sh "sample\$name.mp4"
Run Code Online (Sandbox Code Playgroud)

或者只用单引号键入它

./dd.sh 'sample$name.mp4'
Run Code Online (Sandbox Code Playgroud)

要检查变量中是否有美元符号,请执行

[[ $variable == *\$* ]] && echo 'I HAZ A DOLAR!!!' || echo 'MEH'
Run Code Online (Sandbox Code Playgroud)


dav*_*ers 11

一种选择:

# Replace occurrences of $ with \$ to prevent variable substitution:
filename="${filename//$/\\$}"
Run Code Online (Sandbox Code Playgroud)

我刚刚意识到我的提示是显示foo而不是foo$bar$baz当前分支的名称。foo$bar$baz被分配到PS1$bar然后$baz被扩展。在包含分支名称之前转义美元符号PS1可防止不必要的扩展。


Sau*_*ahu 6

演示:

显然,单引号'不会导致对封闭字符进行插值。

cat > test.sh
echo '$1'
echo "$1"

% ./test.sh hello
$1
hello

% ./test.sh hello$world
$1
hello

% ./test.sh hello\$world
$1
hello$world      << Looks as expected

% ./test.sh 'hello\$world'
$1
hello\$world

% ./test.sh "hello\$world"
$1
hello$world      << Looks as expected
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 5

您的问题不在于 ,echo而在于分配给$filename

你说

filename="sample$name.mp4"
Run Code Online (Sandbox Code Playgroud)

这将插入字符串,这意味着扩展变量$name。这将导致$filename获得该值sample.mp4(因为$name可能是未定义的,这意味着它会扩展为空字符串)

相反,在赋值中使用单引号:

filename='sample$name.mp4'
Run Code Online (Sandbox Code Playgroud)

echo "$filename"现在将产生预期的结果sample$name.mp4。显然,由于单引号,echo '$filename'仍然会打印。$filename