假设给定的用户名为
$user
,要测试的目录为$dir
,我将以下行添加到脚本中:
su -m $user -c "test -r $dir && test -x $dir" if [ $? -ne ]; then echo "$dir不可读或不可执行" fi你觉得这个翻译正确吗?
$user
,要测试的目录为$dir
,我将以下行添加到脚本中:
su -m $user -c "test -r $dir && test -x $dir" if [ $? -ne ]; then echo "$dir不可读或不可执行" fi你觉得这个翻译正确吗?
There seems to be something missing here:
if [ $? -ne ]; then
Surely you meant to write:
if [ $? -ne 0 ]; then
But in fact the test is not necessary because you can use ||
:
su -m $user -c "test -r $dir && test -x $dir" ||
echo "$dir is not readable or executable"
Instead of:
test -r $dir && test -x $dir
you can use the -a
option (logical and) to test
:
test -r $dir -a -x $dir
Where does the variable $user
come from? Is it trusted? If not, there'll be trouble if someone supplies a value like root;
. Even if you are sure that $user
is OK in this case, it's still worth getting into the habit of quoting your variables in shell scripts: here you'd be safe if you had written:
su -m "$user" -c "..."
There's a similar problem if $dir
is untrusted — someone might supply a value like /; sh
. But in this case quoting it like this won't work:
su -m "$user" -c "test -r '$dir' -a -x '$dir'"
because someone might supply a value like /'; sh; echo '
. Instead, you need to pass the quoted "$dir"
to the subshell as a parameter which you can then refer to safely using $1
:
su -m "$user" -c 'test -r "$1" -a -x "$1"' -- "$dir"
su -m $user -c "find $dir >/dev/null 2>&1 || echo $dir is not readable or executable"
find $dir
将返回非零错误代码。find . \( -type d -perm /u+r -o -type d -perm /u+x -o -type f -perm /u+r \)