Bash-if和for语句

Bash-if和for语句,bash,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 及 功能系统信息 { 如果ls/etc/*r

我对“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

功能系统信息
{
如果ls/etc/*release1>/dev/null 2>&1;那么
echo“系统发布信息”
回声“”
对于i in/etc/*发布;do
#因为我们不能确定
#仅限文件的长度
#显示第一行。
总目-n 1$i
完成
uname-orp
回声“”
fi
}#系统结束#信息

…thx用于帮助…

正斜杠是路径分隔符,
*
是文件全局字符
$2/$fn
是一个路径,
$2
指定目录,
$fn
是文件名
/etc/*release
扩展到以“release”结尾的
/etc/*release

/etc/*release
中所有文件的空格分隔列表:这里的
*
将匹配任意数量的字符,因此任何东西
/etc/0release
/etc/asdfasdfr\u release
都将匹配。简单地说,它定义了
/etc/
目录中以字符串
release
结尾的所有文件

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

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


最好检查手动
man bash
和if条件检查
man test
。这里有一个很好的资源:

美元符号标记变量。“-f”运算符表示“文件存在”

所以

检查$filename变量中是否有名为相同值的文件

类似地,如果我们假设$2=“some_folder”和$fn=“some_file”,表达式

for i in /etc/*release; do
如果某个文件夹/某个文件不存在,则返回true

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

将通过该模式命名的所有文件夹进行迭代,例如: /etc/release,/etc/666 release,/etc/wtf_release


我希望这能有所帮助。

使用
ls
测试文件存在性既丑陋又脆弱。不幸的是,正确的编码方式在某种程度上取决于shell。这组特定的嵌套循环可能会压缩为单个循环,如果全局上没有匹配项(即,如果
/etc/*release
与任何文件都不匹配),则该循环不会执行。
-f
开关与
test
[
命令表示文件路径是否为常规文件。
[ -f "$filename" ]
[ ! -f "$2/$fn" ]
for i in /etc/*release; do