0

这段代码似乎有什么问题

#/usr/bin/ksh
RamPath=/home/RAM0
RemoteFile=Site Information_2013-07-11-00-01-56.CSV

cd $RamPath
newfile=$(echo "$RomoteFile" | tr ' ' '_')
mv  "$RemoteFile" "$newfile"

运行脚本后出现的错误:

mv Site Information_2013-07-11-00-01-56.CSV to :653-401 Cannot rename Site Information_2013-07-11-00-01-56.CSV 路径名中的文件或目录不存在。

该文件存在于目录中。我也确实在变量中加上了双引号。上面同样的错误。

oldfile=$(echo "$RemoteFile" | sed 's/^/"/;s/$/"/' | sed 's/^M//')
newfile=$(echo "$RomoteFile" | tr ' ' '_')
mv  "$RemoteFile" "$newfile"
4

1 回答 1

0

至少有两个问题:

  1. 正如@shelter 所建议的那样,该脚本的变量名中有错字。
  2. 应引用分配给变量的值。

错字

newfile=$(echo "$RomoteFile" | tr ' ' '_') # returns an empty string
mv  "$RemoteFile" "$newfile"

shell 是一种非常宽松的语言。错别字很容易出现。

捕获它们的一种方法是在未设置的变量上强制出错。该-u选项将完全做到这一点。包含set -u在脚本的顶部,或使用ksh -u scriptname.

另一种为每个变量单独测试的方法,但它会为您的代码增加一些开销。

newfile=$(echo "${RomoteFile:?}" | tr ' ' '_')
mv  "${RemoteFile:?}" "${newfile:?}"

如果变量未设置或为空,ksh 和 bash 中的${varname:?[message]}构造将产生错误。varname

变量赋值

像这样的作业

varname=word1 long-string

必须写成:

varname="word long-string"

否则,它将读取为为commandvarname=word创建的环境中的分配。 long-string

$ RemoteFile=Site Information_2013-07-11-00-01-56.CSV
-ksh: Information_2013-07-11-00-01-56.CSV: not found [No such file or directory]
$ RemoteFile="Site Information_2013-07-11-00-01-56.CSV"

作为奖励,ksh 允许您在变量扩展期间使用以下${varname//string1/string2}方法替换字符:

$ newfile=${RemoteFile// /_}
$ echo "$newfile"
Site_Information_2013-07-11-00-01-56.CSV

如果您是 (korn) shell 编程的新手,请阅读手册页,尤其是有关参数扩展和变量的部分。

于 2013-07-13T20:34:30.247 回答