假设我有一个名为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 $' ...