我对'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
......请求帮助...
答案 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 ...
我希望这会有所帮助。