Linux 分析Shell脚本中的文件
我需要编写一个shell脚本,它包含一个或多个参数(文件名)。无论文件名是否包含空格,都应正确处理文件名。 对于每个文件,脚本都应该检查该文件是否可读、可写、可执行、是否为普通文件以及是否为目录。对于这些检查中的每一项,应在相应的列中放置一个Y或N。如果文件不存在,则应在每个字段中放置短划线“--”Linux 分析Shell脚本中的文件,linux,bash,shell,terminal,sh,Linux,Bash,Shell,Terminal,Sh,我需要编写一个shell脚本,它包含一个或多个参数(文件名)。无论文件名是否包含空格,都应正确处理文件名。 对于每个文件,脚本都应该检查该文件是否可读、可写、可执行、是否为普通文件以及是否为目录。对于这些检查中的每一项,应在相应的列中放置一个Y或N。如果文件不存在,则应在每个字段中放置短划线“--” Example output: Read Write Execute Plain Dir Filename Y Y Y Y N /tmp/testfiles
Example output:
Read Write Execute Plain Dir Filename
Y Y Y Y N /tmp/testfiles/executable
Y Y N Y N /tmp/testfiles/file with spaces
Y N N Y N /tmp/testfiles/justread
N Y N Y N /tmp/testfiles/justwrite
N N N Y N /tmp/testfiles/noperms
--- --- --- --- --- /tmp/testfiles/nosuchfile
Y Y N Y N /tmp/testfiles/readwrite
Y Y Y N Y /tmp/testfiles/somedir
我不太熟悉unixshell脚本,但在在线阅读了各种文章后,我想到了以下解决方案
#! /bin/sh
echo Read Write Execute Plain Dir Filename
argnum=0
while $argnum < $# do
FileExists $($argnum)
PrintFileName $($argnum)
done
function FileExists()
{
if test -e $1
then
IsReadable $1
IsWritable $1
IsExecutable $1
IsPlain $1
IsDir $1
else
echo --- --- --- --- ---
}
function IsReadable()
{
if test -r $1
then
echo Y
else
echo N
}
function IsWritable()
{
if test -w $1
then
echo Y
else
echo N
}
function IsExecutable()
{
if test -x $1
then
echo Y
else
echo N
}
function IsPlain()
{
if test -f $1
then
echo Y
else
echo N
}
function IsDirectory()
{
if test -d $($argnum)
then
echo Y
else
echo N
}
function PrintFilename()
{
echo $1
}
#/垃圾箱/垃圾箱
回显读写执行普通目录文件名
argnum=0
而$argnum<$#do
FileExists$($argnum)
PrintFileName$($argnum)
完成
函数FileExists()
{
如果测试-e$1
然后
可阅读1美元
可写$1
i可执行$1
1美元
IsDir$1
其他的
回声---------------
}
函数IsReadable()
{
如果测试-r$1
然后
回音Y
其他的
回声
}
函数是可写的()
{
如果测试-w$1
然后
回音Y
其他的
回声
}
函数可执行()
{
如果测试-x$1
然后
回音Y
其他的
回声
}
函数IsPlain()
{
如果测试-f$1
然后
回音Y
其他的
回声
}
函数IsDirectory()
{
如果测试-d$($argnum)
然后
回音Y
其他的
回声
}
函数PrintFilename()
{
回声1美元
}
不幸的是,脚本无法正确执行。我知道有一些问题(特别是在格式方面),但我不确定如何解决它们。如果您有任何帮助/建议,我们将不胜感激
读写执行普通目录文件名。/script:第7行:意外标记“完成”附近的语法错误。/script:第7行:完成” 因为,你需要一个
代码>在之前执行
Bash从上到下扫描,并执行每一行。因此,在前几行中,Bash不知道FileExists
和PrintFileName
。因此,您需要做的是将声明放在调用它们之前
function FileExists
{
...
}
function IsReadable
{
...
}
// more functions..
//Iterate here and call the above functions.
更简洁的迭代方式:
for var in "$@"
do
FileExists $var
PrintFileName $var
done
您可能会遇到格式问题,因为echo会弹出一个换行符;而你可能无法在一条线上得到东西。改为使用printf
,并手动写出printf“\n”
另外,@devnull指出,if
块的每个实例中都缺少fi
读写执行普通目录文件名。/script:第7行:意外标记“完成”附近的语法错误。/script:第7行:完成”
因为,你需要一个代码>在之前执行
Bash从上到下扫描,并执行每一行。因此,在前几行中,Bash不知道FileExists
和PrintFileName
。因此,您需要做的是将声明放在调用它们之前
function FileExists
{
...
}
function IsReadable
{
...
}
// more functions..
//Iterate here and call the above functions.
更简洁的迭代方式:
for var in "$@"
do
FileExists $var
PrintFileName $var
done
您可能会遇到格式问题,因为echo会弹出一个换行符;而你可能无法在一条线上得到东西。改为使用printf
,并手动写出printf“\n”
另外,@devnull指出,if
块的每个实例中都缺少fi
。虽然“function Name()”语法有效,但我更喜欢使用declare-f Name
返回的样式作为我的书面形式,因为我使用“declare-f Name…”来重现函数体
此外,您还可以将每个函数的“echo Y”和“echo N”因子化,只需返回断言的真相。所以,…是可阅读的。。成为:
IsReadable ()
{
test -r $1
}
使用
IsReadable $1 && echo Y || echo N
因为我不觉得“&&”(AND)和“| |”(OR)语法太吵了。还有,我更喜欢这个
[[ -r $1 ]] && echo Y || echo N
因此,我的是可读的
:
isreadable () { [[ test -r $1 ]] ; }
因为我允许“declare-f”规则的一行异常,甚至还有一个函数,fbdy
,它可以
即:如果函数体(少标题、拖车)适合一行,则将其显示为一行,否则,将其显示为默认值
很高兴看到您使用函数。坚持下去。我极力鼓励使用它们。虽然“function Name()”语法有效,但我更喜欢使用declare-f Name
返回的样式作为我的书面形式,因为我使用“declare-f Name…”来重现函数体
此外,您还可以将每个函数的“echo Y”和“echo N”因子化,只需返回断言的真相。所以,…是可阅读的。。成为:
IsReadable ()
{
test -r $1
}
使用
IsReadable $1 && echo Y || echo N
因为我不觉得“&&”(AND)和“| |”(OR)语法太吵了。还有,我更喜欢这个
[[ -r $1 ]] && echo Y || echo N
因此,我的是可读的
:
isreadable () { [[ test -r $1 ]] ; }
因为我允许“declare-f”规则的一行异常,甚至还有一个函数,fbdy
,它可以
即:如果函数体(少标题、拖车)适合一行,则将其显示为一行,否则,将其显示为默认值
很高兴看到您使用函数。坚持下去。我极力鼓励使用它们。“很遗憾,脚本执行不正确。”,什么是正确的?可以附加当前输出吗?读写执行普通目录文件名。/脚本:第7行:意外标记附近的语法错误done./脚本:第7行:
done“需要在字符串周围添加一些”或“以避免空格问题”。遗憾的是,脚本无法正确执行。“,什么是正确的?您可以附加当前输出吗?读写执行普通目录文件名。/script:第7行:意外标记附近的语法错误done'。/script:第7行:
done'您需要添加一些“或‘环绕字符串以避免空格问题。谢谢!如果没有传入任何参数,脚本现在将正确执行。如果传入任何文件名,我会得到以下输出:./script testfile Read Write Execute Plain Dir Filename./script:line 6:FileExists:command not found./script:line 7:PrintFileName:command not found现在很好!谢谢你的帮助,谢谢!如果没有传入任何参数,脚本现在将正确执行。如果传入任何文件名,我将得到以下输出:./scrip