Bash - if和for statement

时间:2011-08-23 09:30:31

标签: bash

我对'if ... then ... fi'和'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

......请求帮助...

3 个答案:

答案 0 :(得分:1)

/etc/*release:此处*将匹配任意数量的任何字符,因此任何/etc/0release/etc/asdfasdfr_release等内容都将匹配。简单地说,它定义了/etc/目录中以字符串release结尾的所有文件。

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

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

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

答案 1 :(得分:0)

正斜杠是路径分隔符,*是文件glob字符。 $2/$fn$2指定目录且$fn是文件名的路径。 /etc/*release扩展为/etc中名称以“release”结尾的所有文件的空格分隔列表

答案 2 :(得分:0)

美元符号标志着变数。 “-f”运算符表示“文件存在”。

所以,

[ -f "$filename" ]

检查是否存在与$ filename变量中包含的值相同的文件。

Simmilar,如果我们假设$ 2 =“some_folder”,$ fn =“some_file”,表达式

[ ! -f "$2/$fn" ]
如果文件some_folder / some_file不存在,则

返回true。

现在,关于星号 - 它标记“零或更多的任何字符”。所以,表达:

for i in /etc/*release; do

将遍历该模式命名的所有文件夹,例如: / etc / release,/ etc / 666release,/ etc / wtf_release ...

我希望这会有所帮助。