0

我正在编写 shell 脚本:

read newcatalog
newcatalog=`'print -- $newcatalog | sed 's/^-/\.\/-/'`
cd "$newcatalog"

newcatalog 这是新目录的名称。目录名称应该支持 * ? 和任何选项。

目录名称中的“-n”“-y”和其他“-”工作正常,但*不起作用,因为

print -- $newcatalog 

方法

print -- * | sed 's/^-/\.\/-/'

它发送到sed所有文件,但我只想发送*,如下所示:

print -- "*" | sed 's/^-/\.\/-/'
4

2 回答 2

1

这一行是错误的:

newcatalog=`'print -- $newcatalog | sed 's/^-/\.\/-/'`

反引号内的第一个单引号是一个闯入者,shell 应该向您诊断它。

newcatalog=`print -- $newcatalog | sed 's/^-/\.\/-/'`

(这留下了您实际执行什么的问题。)通常,您应该使用$(...)而不是`...`.

newcatalog=$(print -- $newcatalog | sed 's/^-/\.\/-/')

如果您试图避免 shell 元字符扩展*,请$newcatalog用双引号括起来:

newcatalog=$(print -- "$newcatalog" | sed 's/^-/\.\/-/')

那不会完全保护你。如果有人键入:$(rm -f *)作为对 的响应read catalog,即使使用双引号,您也会遇到严重的问题。

于 2013-03-10T17:35:53.167 回答
0

你工作太辛苦了。无需调用sed即可进行替换。做就是了:

test "${newcatalog#-}" = "$newcatalog" || newcatalog="./$newcatalog"
于 2013-03-10T19:10:55.783 回答