为什么是 ! shell脚本中使用的字符

为什么是 ! shell脚本中使用的字符

我最近遇到了一种情况,我尝试!在 shell 脚本中将字符串数组用作记录分隔符。当我在 shell 脚本中使用它时,脚本会自动扩展。重现这种情况的示例如下。

check_variable="Hello"
echo "$check_variable"
Output: Hello
###For multiple strings, I tried to concatenate with ! as a record separator. 
echo "$check_variable !"
Output: echo "$check " > Results.txt

经过一番研究,我发现它!实际上是一个特殊字符,不应该用作记录分隔符。那么,到底为什么要!使用呢?有什么方法可以关闭该!角色并在 shell 脚本中使用它吗?

答案1

!实际上,对于为什么使用 from有一个很好的解释这里。为了更清楚地理解该命令,我执行了以下命令。

pwd- It gives the present working directory.
!pwd - It executes the previously executed pwd command.

此设置可能很危险,因为用户可能会!rm错误执行,从而导致前所未有的结果。

测试角色有效性的另一种方法!是,

echo "12345647" >> ramesh.txt
cat ramesh.txt
12345647
!echo
cat ramesh.txt
12345647
12345647

我们可以看到,该!echo命令实际上已被执行,并附加了以下行1234567到文件。

尽管不建议在脚本中使用特殊字符作为文件分隔符或记录分隔符,但可以通过执行以下命令覆盖此设置。

set -H turns it on; 
set +H turns it off.

答案2

不直接相关,但请记住,将内容括在“”中会插入所说的内容。在你的第一行:

check_variable="Hello"

字符串中没有任何内容需要解释,那么为什么要这样做呢?当您通过 echo 使用 $check_variable 时,这也适用

check_variable='Hello'
echo $check_variable

这将导致 Hello 按照您的预期打印出来。

如果你必须使用保留字符作为分隔符,通过 echo 使用它时不要引用它:

$ echo $check_variable ! > Results.txt
$ cat Results.txt
Hello !
$ echo '$check_variable !'
$check_variable !

请记住,在这种情况下,echo 只是打印出它收到的每个参数(echo 行中的 ! 被视为第二个参数),并且并非所有命令都会执行类似的操作。在这种情况下,Bash 不会将其视为特殊的,因为 A)它是另一个命令的参数,并且 B)您不会尝试通过将其括在“”中来插入它。最后一个回显只是为了表明使用 '' 会将其中的所有内容视为字面意思 - 没有任何插值。

尽管如此,我还是会重复其他字符,并说您应该尽可能避免将特殊/保留字符用作其预期用途之外的任何内容(如果可能的话)。

相关内容