确保 bash 脚本变量是有效权限位的有效方法是什么?
What is efficient way to ensure bash script variable is valid permission bits?
我对 bash
脚本没有经验,主要是从 google 搜索中拼凑东西。以下简单脚本创建文件 foo 并将其权限位更改为脚本的 </code> 是什么。有经验的 <code>bash
脚本编写者能否建议什么是正确的 and/or 有效方法来确保 </code> 是有效的权限位,即有效的 <code>arg1
到 chmod
?
#!/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
我对 bash
脚本没有经验,主要是从 google 搜索中拼凑东西。以下简单脚本创建文件 foo 并将其权限位更改为脚本的 </code> 是什么。有经验的 <code>bash
脚本编写者能否建议什么是正确的 and/or 有效方法来确保 </code> 是有效的权限位,即有效的 <code>arg1
到 chmod
?
#!/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