Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 转义bash变量_Linux_Bash - Fatal编程技术网

Linux 转义bash变量

Linux 转义bash变量,linux,bash,Linux,Bash,我有点受不了了。我在脚本顶部删除一个变量,然后创建一个文件作为脚本的一部分: app="testing" cat <<EOF >/etc/init.d/test #!/bin/bash args="--emperor $APPCONF/test/$APP.ini" EOF app=“测试” cat使用一致的情况。变量名区分大小写。除了使用一致的大小写($app不同于$app),您可能希望将变量名括在括号内-如果在变量值之间使用空格,则可能会出现问题,这被认为是一种良好的做法。

我有点受不了了。我在脚本顶部删除一个变量,然后创建一个文件作为脚本的一部分:

app="testing"
cat <<EOF >/etc/init.d/test
#!/bin/bash
args="--emperor $APPCONF/test/$APP.ini"
EOF
app=“测试”

cat使用一致的情况。变量名区分大小写。

除了使用一致的大小写(
$app
不同于
$app
),您可能希望将变量名括在括号内-如果在变量值之间使用空格,则可能会出现问题,这被认为是一种良好的做法。例如:

args="--emperor ${APPCONF}/test/${APP}.ini"

这样,
$APPCONF
也不会与
${APP}CONF
混淆。我希望这有帮助

我不太明白你的问题。我想你想以一个文件结束

/etc/init.d/test
包含以下文本:

#!/bin/bash
args="--emperor $APPCONF/test/testing.ini"
如果是这样,您的脚本应该是:

app="testing"
cat <<EOF >/etc/init.d/test
#!/bin/bash
args="--emperor \$APPCONF/test/$app.ini"
EOF
app=“测试”

cat假设你的方法是正确的。您希望将数据存储在数组中:

args=( --emperor "${appconf}/test/${app}.ini" )
run_something "${args[@]}"
然后将其转换为用于嵌入的字符串:

printf -v args_str '%q ' "${args[@]}"`
…并在heredoc中使用该字符串:

#!/bin/bash
args=( $args_str )
EOF
…除此之外,正在创建的脚本中的任何内容都希望将其扩展为数组:

args=( --emperor "${appconf}/test/${app}.ini" )
run_something "${args[@]}"

有关基本原理和详细信息,请参见。

这与转义变量有什么关系?转义用于防止对某个内容进行评估,而不是强制对其进行评估。这是一个新手问题,我仍在学习。顺便说一句,BashFAQ#50与您在这里编写的代码非常相关:谢谢,dee。但是,这是唯一的问题吗?我看到有人提到过这样做:
args=“--emperor$APPCONF/test/\$APP.ini”
仅当您希望输出中有“$”时才这样做,而不是表示您希望扩展变量。试一试。在某些情况下,这是没有帮助的——如果
APPCONF
的目录名包含空格怎么办?我不是100%确定,但这不应该用双引号括起来吗。。。老实说,我从来没有认真考虑过这个问题,所以谢谢你提出来:)双引号处理赋值的结尾,但不是你实际尝试在某个地方使用参数列表的那一面。当您使用它时,需要强制它在
--emperon
和文件名之间的空格上拆分字符串;在扩展的
APPCONF
中不拆分任何空格的情况下执行此操作是很棘手的。顺便说一句,
$app
${app}
在处理空格方面没有任何区别。如果您想区分扩展参数的结束位置--
${foo}bar
vs
$foobar
,或者如果您想执行一些奇特的PE操作--
${foo//bar/baz}
,则需要更详细的语法,例如——但在这里的简单情况下,每个要展开的变量名后面都跟有一个在POSIX变量名中不合法的字符,这是不必要的。