如果我运行以下 .sh 文件:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
结果是一个错误:
sed: -e 表达式 #1, char 18: 无效的范围结束
但是,如果我运行以下 .sh 文件:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
它运行没有错误。第二个代码不应该与第一个代码等效吗?为什么第一个错误?
如果我运行以下 .sh 文件:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
结果是一个错误:
sed: -e 表达式 #1, char 18: 无效的范围结束
但是,如果我运行以下 .sh 文件:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
它运行没有错误。第二个代码不应该与第一个代码等效吗?为什么第一个错误?
当使用 name 调用 bash 时
sh
,它会执行以下操作:然后将
POSIXLY_CORRECT
shell 变量设置为y
:bind_variable
调用bind_variable_internal
,如果 shell 属性a
当时是打开的(如果你用 调用 shell 会是这样-a
),将 shell 变量标记为export。所以在你的第一个脚本中:
sed
在其环境中调用 withPOSIXLY_CORRECT=y
,这将使它抱怨[\d001-\d008]
. (如果给 sed--posix
选项,也会发生同样的事情。)在 GNU sed 中,是以 10 为基数的数值为NNN的字符的转义码,但在 POSIX 模式下,在括号表达式内禁用此功能,因此, 字面意思是字符,等,范围为到. 按照字符代码的顺序,在前面(范围包括除零以外的所有数字,加上所有大写字母,加上一些特殊字符)。但是,在您使用的语言环境中,排序在 之前,因此范围无效。
\dNNN
[\d001-\d008]
\
d
1
\
1
\
en_US.UTF-8
\
1
在您的第二个脚本中:
即使
POSIXLY_CORRECT
在 shell 中设置,它也不会被导出,因此 sedPOSIXLY_CORRECT
在环境中被调用,并且 sed 使用 GNU 扩展运行。如果您
export POSIXLY_CORRECT
在第二个脚本的顶部附近添加,您还会看到 sed 抱怨。