Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 字符的意外替换_Linux_Shell - Fatal编程技术网

Linux 字符的意外替换

Linux 字符的意外替换,linux,shell,Linux,Shell,我有一个脚本需要动态组装另一个脚本以供以后执行,但是我遇到了替换字符的问题,特别是任何转义的字符,例如\\,\t,\n等等。虽然我可以用变量来解决这个问题,但这非常烦人,特别是当代码以引用的形式包装在文档中时,代码是以段的形式提供的,因此根本不应该对它们进行处理 更令人恼火的是,在某些平台上,这种替换似乎也扩展到了其他字符,例如\1,这对我的正则表达式测试造成了极大的破坏 下面是一个简单的例子: #!/bin/sh script=$(cat << 'SCRIPT' #!/bin/sh

我有一个脚本需要动态组装另一个脚本以供以后执行,但是我遇到了替换字符的问题,特别是任何转义的字符,例如
\\
\t
\n
等等。虽然我可以用变量来解决这个问题,但这非常烦人,特别是当代码以引用的形式包装在文档中时,代码是以段的形式提供的,因此根本不应该对它们进行处理

更令人恼火的是,在某些平台上,这种替换似乎也扩展到了其他字符,例如
\1
,这对我的正则表达式测试造成了极大的破坏

下面是一个简单的例子:

#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)

DIR=$(dirname "$PWD")
echo "$script" > "$DIR/test_script.sh"
#/垃圾箱/垃圾箱
脚本=$(cat“$DIR/test\u script.sh”
我希望这将生成一个简单的脚本,其中包含一行
printf'\t%s'$1“
,但是当不需要替换时,该行将生成为
printf''%s'$1“


有人能解释为什么会发生这种情况,以及理想情况下如何防止这种情况发生吗?就像我说的,我可以用替换字符的变量来解决这个问题,但这会破坏我脚本的可读性(而且调试起来很麻烦).

将脚本转储到文件时,您的
echo
版本似乎会处理一些转义字符。
echo
没有很好的标准化,因为任何标准都会与以前的实现冲突。请改用
printf

#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)

DIR=$(dirname "$PWD")
printf "%s\n" "$script" > "$DIR/test_script.sh"
!/bin/sh
脚本=$(cat“$DIR/test\u script.sh”

将脚本转储到文件时,您的
echo
版本似乎会处理一些转义字符。
echo
没有很好的标准化,因为任何标准都会与以前的实现冲突。请改用
printf

#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)

DIR=$(dirname "$PWD")
printf "%s\n" "$script" > "$DIR/test_script.sh"
!/bin/sh
脚本=$(cat“$DIR/test\u script.sh”

将脚本转储到文件时,您的
echo
版本似乎会处理一些转义字符。
echo
没有很好的标准化,因为任何标准都会与以前的实现冲突。请改用
printf

#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)

DIR=$(dirname "$PWD")
printf "%s\n" "$script" > "$DIR/test_script.sh"
!/bin/sh
脚本=$(cat“$DIR/test\u script.sh”

将脚本转储到文件时,您的
echo
版本似乎会处理一些转义字符。
echo
没有很好的标准化,因为任何标准都会与以前的实现冲突。请改用
printf

#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)

DIR=$(dirname "$PWD")
printf "%s\n" "$script" > "$DIR/test_script.sh"
!/bin/sh
脚本=$(cat“$DIR/test\u script.sh”

介意告诉你的bash版本吗(
bash script.sh
)?这可能是一个bug。@konsolebox我不完全确定,因为我正在通过
sh
运行脚本,但运行
sh-c'echo$SHELL'
表明它是一个bash SHELL,而
readlink/bin/sh
将其报告为破折号。我认为后者是正确的,因为许多内置程序与我在终端窗口中使用的程序不同。它对不过,请允许我在有限的环境中运行,因为我正在尝试尽可能跨平台(这对我的理智造成了很大的损害=)请告诉您的bash版本(
bash script.sh
)?这可能是一个bug。@konsolebox我不完全确定,因为我正在通过
sh
运行脚本,但运行
sh-c'echo$SHELL'
表明它是一个bash SHELL,而
readlink/bin/sh
将其报告为破折号。我认为后者是正确的,因为许多内置程序与我在终端窗口中使用的程序不同。它对不过,请允许我在有限的环境中运行,因为我正在尝试尽可能跨平台(这对我的理智造成了很大的损害=)请告诉您的bash版本(
bash script.sh
)?这可能是一个bug。@konsolebox我不完全确定,因为我正在通过
sh
运行脚本,但运行
sh-c'echo$SHELL'
表明它是一个bash SHELL,而
readlink/bin/sh
将其报告为破折号。我认为后者是正确的,因为许多内置程序与我在终端窗口中使用的程序不同。它对不过,请允许我在有限的环境中运行,因为我正在尝试尽可能跨平台(这对我的理智造成了很大的损害=)请告诉您的bash版本(
bash script.sh
)?这可能是一个bug。@konsolebox我不完全确定,因为我正在通过
sh
运行脚本,但运行
sh-c'echo$SHELL'
表明它是一个bash SHELL,而
readlink/bin/sh
将其报告为破折号。我认为后者是正确的,因为许多内置程序与我在终端窗口中使用的程序不同。它对不过,让我在有限的环境中运行,因为我正试图尽可能地跨平台(这对我的理智造成了很大的损害=)呃,我不敢相信答案会像那样盯着我看,特别是在我在脚本的其他部分大量使用了
printf
之后!无论如何,谢谢,我会去掉我一直使用的所有变量,并希望在下一次不兼容之前取得更多进展;)呃,我不敢相信答案会像那样盯着我看,特别是在我在脚本的其他部分大量使用了
printf
之后!无论如何,谢谢,我会去掉我一直使用的所有变量,并希望在下一次不兼容之前取得更多进展;)呃,我不敢相信答案会像那样盯着我看,特别是在我在脚本的其他部分大量使用了
printf
之后!无论如何,谢谢,我会去掉我一直使用的所有变量,并希望在下一次不兼容之前取得更多进展;)呃,我不敢相信答案会像那样盯着我看,尤其是在我在脚本的其他部分大量使用了
printf
之后!无论如何,谢谢你,我会去掉我一直在使用的所有变量,希望能在下一次inco之前取得更多进展