假设我有一个名为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可防止不必要的扩展。
演示:
显然,单引号'不会导致对封闭字符进行插值。
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)
您的问题不在于 ,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