Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 分析Shell脚本中的文件_Linux_Bash_Shell_Terminal_Sh - Fatal编程技术网

Linux 分析Shell脚本中的文件

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

我需要编写一个shell脚本,它包含一个或多个参数(文件名)。无论文件名是否包含空格,都应正确处理文件名。 对于每个文件,脚本都应该检查该文件是否可读、可写、可执行、是否为普通文件以及是否为目录。对于这些检查中的每一项,应在相应的列中放置一个Y或N。如果文件不存在,则应在每个字段中放置短划线“--”

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