确保 bash 脚本变量是有效权限位的有效方法是什么?

What is efficient way to ensure bash script variable is valid permission bits?

我对 bash 脚本没有经验,主要是从 google 搜索中拼凑东西。以下简单脚本创建文件 foo 并将其权限位更改为脚本的 </code> 是什么。有经验的 <code>bash 脚本编写者能否建议什么是正确的 and/or 有效方法来确保 </code> 是有效的权限位,即有效的 <code>arg1chmod

#!/bin/sh
#mkfoo.sh

if [ $# -eq 0 ]
then
  return
fi

perm=

touch ./foo
chmod "${perm}" ./foo

由于我经验不足,我不清楚 when/why 变量是字符串还是整数。由于权限位可能的值数量,字符串验证方法感觉不可行。我想到的是,我想验证 是否 是一个整数,如果是,则它在 0 到 777 之间。但我不清楚这是否是sufficient/efficient 验证:我对 linux 文件权限有了初步的了解,我被引导相信其中有很多微妙之处。感谢您的帮助。

根据您的意见,如果指定的权限无效,您的目标是放弃 chmod。

chmod "" ./foo 2>/dev/null

2 是 stderr 的文件描述符。重定向到 /dev/null 将让它静默失败。 chmod,如评论中所述,对权限是否可接受进行自己的验证。

如果您只想允许数字权限,您可以使用模式检查来检查它们:

case "$perms" in 
    [0-7][0-7][0-7]) 
        touch ./foo
        chmod "${perm}" ./foo
        ;;
    *) 
        echo "Invalid permissions $perms"
        ;;
esac

正如其他人所提到的,chmod 会进行自己的验证,因此最好只使用它,但如果您绝对想以类似于您提供的代码的方式执行此操作,您可以这样做:

#!/bin/sh
if [ $# -eq 0 ]
then
    echo "Invalid input"
    exit 1
fi

if ! [[  =~ [0-7][0-7][0-7] ]]
then
    echo "Invalid input"
    exit 1
else
    perm=
fi

touch ./foo
chmod "${perm}" ./foo

这将确保每个数字都是有效的。

此脚本将接受 chmod 允许的任何有效权限。
它将创建文件(如果它不存在)并尝试设置权限。如果设置权限失败,文件将被删除。
它只需要两个参数;要创建的文件名和要设置的权限。

这允许您使用符号或 4 位数字权限,例如 create foo u+x,g+rwx(假设脚本名为 "create")或 create foo 2640

这很简单,举个例子。我经常包含一个 usage() 函数,我会调用它来代替第一个 echo。如果省略秒参数,您还可以包括默认权限。

#!/bin/sh

if [ $# -ne 2 ]
then
    echo "output a usage message, don't just return"
    exit
fi

if [ -e "" ]
then
    echo " already exists"
    exit
fi

touch ./""

if chmod "" "" > /dev/null 2>&1
then
    echo " created with permissions "
else
    rm ""
    echo " not created: invalid permissions: "
fi