我正在尝试编写一个脚本,该脚本将一个或多个文件作为参数,并将大写字母转换为小写字母。原始文件的内容将替换为仅小写的内容。
参数中给出的文件必须存在,必须是普通文件,必须允许读/写,不能允许执行,也不能为空。
# We assume the current file is valid.
declare valide="true"
if (("$#" < 1)) ; then
# Error, you must enter at least one parameter.
echo -e "Erreur. Vous devez entrer au moins un parametre."
fi
for param in "$@" ; do
if [ ! -e $param ] ; then
$valide="false"
elif [ ! -f $param ] ; then
$valide="false"
elif [ ! -r $param ] ; then
$valide="false"
elif [ ! -w $param ] ; then
$valide="false"
elif [ -x $param ] ; then
$valide="false"
elif [ -s $param ] ; then
$valide="false"
fi
if [ $valide=="true" ] ; then
# Create temporary file.
ficTemp=$(/usr/bin/mktemp)
$(tr '[:upper:]' '[:lower:]' < $param > $ficTemp)
$($ficTemp > $param)
else
# Error, the file $param is invalid for this script.
echo -e "Erreur. Le fichier $param est invalide pour ce script."
fi
done
我的问题是,当我在普通 shell(非 root)中执行脚本时出现以下错误:
line 45: /tmp/tmp.xxx: Permission denied
以下是 ls -ld /tmp 的结果:
drwxrwxrwt. 12 root root 380 May 14 18:35 /tmp
答案1
我不知道第 45 行是哪一行,但该行$($ficTemp > $param)
是错误的,可能会出现此错误:它尝试将临时文件作为脚本执行并将其输出写入$param
,然后执行返回的字符串。
有两点明显错误:-
- 除非您遇到异常,否则
umask
您没有使临时文件可执行,因此会出现错误。 - 脚本的输出被重定向,因此永远不会返回任何内容,并且
$()
没有任何用处。
你想做什么?如果你想将临时文件复制回原始文件,则以下任何一种方法都可以实现:-
cat $ficTemp > "$param"
cp $ficTemp "$param"
mv $ficTemp "$param"
最后一种方法更加高效,因为它不需要访问数据并且它同时删除临时文件,但是原来的所有者和访问权限被替换了(感谢 G-Man 指出这一点)。
无论您做什么,都应该使用"$param"
,以允许在文件名或路径中嵌入空格。