我是 bash 新手,无法让脚本工作。这是我的代码:
#!/bin/bash
file=~/scripts/text.txt
if [ -e $file ]
then echo "The file exists"
elif [ ! -e $file ]
then echo "The file does NOT exist"
fi
sleep 1s
if [ ! -w $file ]
then { sudo chmod u+w $file; } && { echo "The file is now writable"; }
elif [ -w $file ]
then echo "The file is already writable"
fi
脚本的顶部用于检查文件是否存在,工作得很好。检查文件是否可写的底部部分部分有效。它将更改文件的权限。但之后,启用写权限后,它仍然会回显“文件现在可写”而不是“文件已经可写”
就像我说的,我是 bash 的新手,所以任何帮助将不胜感激。请保持简单,因为 if 语句的复杂程度是我目前的知识所能承受的。
答案1
奇怪的是,您用来sudo
更改文件的权限,即使它位于您的主目录中。该文件属于您吗?chmod u+w
只授予文件所有者写入权限。如果您是所有者,则不需要 sudo。如果您不是所有者,则确实需要sudo
,但chmod u+w
只授予所有者写入权限,不会授予您写入文件的权限。所以运行后chmod u+w
,该文件仍然不可写,这是[ -w … ]
测试的结果。
运行ls -l ~/scripts/text.txt
以检查文件的所有权和权限。
除此之外,始终在变量替换周围加上双引号。 (或者你可以学习所有规则并使你的脚本很难被那些不了解所有规则的人维护。)令人烦恼的是,$file
在 shell 语法中并不意味着“获取变量的值file
”,它的意思是“获取变量的值file
,将其解析为通配符模式列表,如果存在匹配文件,则用匹配文件列表替换每个模式”。如果替换发生在双引号内,则此额外的内容将被关闭:"$file"
意味着“获取变量的值file
”。
此外,您不需要所有这些支架。
if [ ! -w "$file" ]
then
sudo chmod u+w "$file" && echo "The file is now writable"
elif [ -w "$file" ]
then
echo "The file is already writable"
fi
由于[ -w "$file" ]
是 的否定[ ! -w "$file" ]
,因此elif
如果达到该值,测试将始终成功。 (除非存在竞争条件,在这种情况下,elif
再次测试相同条件的测试可能会返回不同的结果,这很糟糕。)因此您可以并且应该将其简化为
if [ ! -w "$file" ]
then
sudo chmod u+w "$file" && echo "The file is now writable"
else
echo "The file is already writable"
fi
答案2
你缺少一个报价。
echo "The file is now writable;
应该
echo "The file is now writable";
现在您已经解决了这个问题,我认为您只是更改了代表所有者的权限root
(不是 100% 熟悉字母权限方案) ,即.u
root
您可能想尝试使用a
or o
,现在制作该行
then { sudo chmod a+w $file; } && { echo "The file is now writable"; }
附加事项:exit 1
当文件不存在时您可能需要这样做。
答案3
尝试下面的代码。
#!/bin/bash
file=~/scripts/text.txt
# To check existence of the file
[ -e $file ] && E="The file exists" || E="The file does NOT exists"
echo "$E"
# checking whether the file is writable or not and changing permissions
[ -w $file ] && F="The file is already Writable" || F="The file is now Writable"
chmod u+w $file
echo "$F"
答案4
使用以下脚本进行测试并且工作正常
下面的脚本将测试当前登录用户的写入条件,如果没有写入权限,则仅当文件所有者与当前登录用户相同时才会添加写入权限
如果您想对所有人都有写权限,请使用 sudo chmod a+w path
#!/bin/bash
path="/scripts/text.txt"
if [[ -f $path ]]
then
echo "$path file exsists"
if [[ -w $path ]]
then
echo "$path file is writable"
else
echo "$path file is not writable"
echo "Now we are adding write acess to the file"
chmod u+w $path
if [[ -w $path ]]
then
echo "$path file is writable now"
fi
fi
else
echo "$path file doesnt exsists"
fi