簡體   English   中英

在Shell腳本中分析文件

[英]Analyzing Files in a Shell Script

我需要編寫一個包含一個或多個參數(文件名)的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

我對UNIX shell腳本不是很熟悉,但是在在線閱讀了各種文章之后,我想到了以下解決方案。

#! /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
}

不幸的是,腳本無法正確執行。 我知道有問題(尤其是格式問題),但是我不確定如何解決它們。 您的任何幫助/建議都將不勝感激。

讀寫執行普通Dir文件名./script:第7行:意外標記附近的語法錯誤已完成'./script:7行:已完成

這是因為,您需要一個; do之前。

Bash從上到下掃描,並執行每一行。 因此,在前幾行中,Bash不了解FileExistsPrintFileName 因此,您需要做的是調用聲明之前放置聲明。

function FileExists
{
...
}

function IsReadable
{
...
}
// more functions..

//Iterate here and call the above functions.

更干凈的迭代方式:

for var in "$@"
do
    FileExists $var
    PrintFileName $var
done

您可能會遇到格式問題,因為echo會換行。 而且您可能無法一things而就。 請改用printf ,然后手動寫出printf "\\n"

另外,@ devnull指出,在if塊的每個單個實例中都缺少fi

盡管“ function Name()”語法有效,但我更喜歡declare -f Name返回的樣式作為我的書面形式,因為我使用“ declare -f name ...”來重現函數主體。

同樣,您可以從每個函數中考慮“回聲Y”和“回聲N”,只需返回斷言的真相即可。 因此,... IsReadable,..變成:

  IsReadable () 
  {
      test -r $1
  }

並使用

  IsReadable $1 && echo Y || echo N

因為我找不到“ &&”(與)和“ ||” (OR)語法太吵。 另外,我更喜歡這個

  [[ -r $1 ]] && echo Y || echo N

所以,我是isreadable

  isreadable () {  [[ test -r $1 ]] ; }

因為我允許“ declare -f”規則的單行例外,甚至還有一個函數, fbdy可以做到這一點:如果函數主體(較少的標頭,尾部)適合一行,則將其顯示為單行,否則,將其顯示為默認值。

很高興看到您使用函數。 保持。 我大力鼓勵使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM