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



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

./dd.sh sample$name.mp4

所以$1是字符串sample$name.mp4

echo '$1' // shows $1
echo "$1" // shows "sample.mp4"; want "sample$name.mp4"

那么如何处理$1,我可以检测到参数中是否有美元符号 $1

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

如您所知,美元符号标志着变量。键入时必须考虑到它。

您可以逃脱美元

./dd.sh "sample$name.mp4"

或仅用单引号

键入它
./dd.sh 'sample$name.mp4'

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

[[ $variable == *$* ]] && echo 'I HAZ A DOLAR!!!' || echo 'MEH'

一个选项:

# Replace occurrences of $ with $ to prevent variable substitution:
filename="${filename//$/\$}"

我刚刚意识到我的提示是显示foo而不是foo$bar$baz作为当前分支的名称。然后将foo$bar$baz分配到PS1,然后扩展$bar$baz。在PS1中包含分支名称之前,请逃脱美元标志,以防止不必要的扩展。

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

你说

filename="sample$name.mp4"

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

相反,在作业中使用单个引号:

filename='sample$name.mp4'

echo "$filename"现在将导致预期的sample$name.mp4。显然,echo '$filename'仍然仅由于单引号而打印$filename

演示:

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

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

如果您的问题是:

那么如何处理$ 1,我可以检测到是否有美元 登录参数$ 1

您可以尝试以下方法:

if [[ $1 == *'$'* ]]
then
   echo '$ was found'
else
   echo '$ was not found'
fi

输出:

$ ./dd.sh 'sample$name.mp4'  // prints $ was found
$ ./dd.sh 'samplename.mp4'  // prints $ was not found

例如,您的 .env 文件带有变量和Postgres db的密码。如您所知,密码应为URLENCOD编码课程在密码中唱歌。所以我们在这里有问题。因为bash忽略 $ ,我们总是遇到编码的密码。

.env文件

   db_name = sone_db    db_pass = a1 $ bb%!y $#带有美元标志    ...

bash脚本

   #!/bin/bash    psql_command =" drop schema public Cascade;"    psql_command ="创建模式public;"    设置-o allexport    #设置源文件,并访问.env中的所有变量    来源/path/.env    encoded_pass = $(python -c"来自urllib.parse import quote; print(quote('$ db_pass'))");    psql Postgres://$ db_user:$ encoded_pass@$ db_host:5432/$ db_name -c" $ psql_command"    echo $ db_pass#返回a1%!y $    回声'$ db_pass'#返回$ db_pass    echo" $ db_pass"#返回a1%!y $    #禁用变量    设置  o allexport    #无法工作,因为bash在字符串中找到$ sing,并认为这是可变的,    因此,在第一和最后一个回声中错过了部分$ bb%

要解决此问题,您需要在 .env file easce string snings in Quote

    ...    db_pass ='a1 $ bb%!y $'    ...

最新更新