[英]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不了解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會換行。 而且您可能無法一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.