2011-08-23 140 views
0

我对'if ... then ... fi'和'for'语句语法有点不熟悉。Bash - if和for语句

任何人都可以解释下面代码片段中的“$ 2/$ fn”和“/ etc/* release”是什么意思?......特别是使用正斜杠....和星号.. 。

if [ -f "$filename" ]; then 
    if [ ! -f "$2/$fn" ]; then 
     echo "$fn is missing from $2" 
     missing=$((missing + 1)) 
    fi 
fi 

function system_info 
{ 


if ls /etc/*release 1>/dev/null 2>&1; then 
    echo "<h2>System release info</h2>" 
    echo "<pre>" 
    for i in /etc/*release; do 

     # Since we can't be sure of the 
     # length of the file, only 
     # display the first line. 

     head -n 1 $i 
    done 
    uname -orp 
    echo "</pre>" 
fi 

} # end of system_info 

... THX的帮助...

+0

使用'ls'来测试文件的存在是丑陋和脆弱的。不幸的是,编码的正确方式有点依赖于你的shell。这个特定的嵌套循环可能会被压缩为一个循环,如果glob上没有匹配(即,如果/ etc/* release'不匹配任何文件),该循环就不会执行。 – tripleee

回答

1

/etc/*release:这里的*将匹配任何数目的字符,所以任何事情/etc/0release/etc/asdfasdfr_release等将被匹配。简单地说,它定义了/etc/目录中以字符串release结尾的所有文件。

$2是shell脚本的第二个命令行参数,$fn是其他一些shell变量。变量替换后的"$2/$fn"将生成一个字符串,并且[ -f "$2/$fn" ]将测试替换后形成的字符串是否形成由-f开关指定的常规文件的路径。如果它是一个常规文件,则执行if的正文。

for循环中,循环将循环目录/etc(路径)中以字符串release结尾的所有文件。在每次迭代中,i将包含下一个这样的文件名,并且对于每次迭代,文件的前1行通过head命令通过从正文内的变量i获取文件名来显示。

最好检查手册man bash,如果条件检查man test。这是一个很好的资源:http://tldp.org/LDP/Bash-Beginners-Guide/html/

+0

thx给所有人的回复... @ phoxis - cool guide!.. thx .. – user614454

0

正斜杠的路径分隔符,而*是一个文件名匹配字符。 $2/$fn$2指定目录的路径,$fn是文件名。 /etc/*release扩展到所有文件中/etc他的名字在结束空格分隔列表“释放”

0

美元符号标志变量。 “-f”运算符表示“文件exsists”。

所以,

[ -f "$filename" ] 

检查是否有名为一样包含在$文件名可变值文件。

Simmilar,如果我们假设$ 2 = “some_folder”,和$ FN = “SOME_FILE”,表达

[ ! -f "$2/$fn" ] 

返回true,如果文件some_folder/SOME_FILE不exsist。

现在,关于星号 - 它表示“零个或更多的任何字符”。因此,表达式:

for i in /etc/*release; do 

将槽循环通过模式命名的所有文件夹,例如: 的/ etc /释放,在/ etc/666release,在/ etc/wtf_release ...

我希望这有助于。

+0

'-f'用'test'或'''开关'或者''命令意味着文件路径是普通文件。 – phoxis