现在我正在使用下面的命令获取OSX中挂载磁盘的卷名:
$exec = "df -lH | grep \"/Volumes/*\" | tr -s \" \" | sed 's/ /;/g'";
使用以下代码解析输出:
$lines = explode("\n", $output);
$i = 0;
foreach ($lines as $line) {
$driveinfo = explode(";", $line);
$driveinfo[7] = trim($driveinfo[0]);
if (!empty($driveinfo[0]))
$allremovabledrives[$driveinfo[0]] = $driveinfo;
$i++;
}
如果Volume标签中没有空格,这可以正常工作:
[/dev/disk1s1] => Array
(
[0] => /dev/disk1s1
[1] => 32G
[2] => 31G
[3] => 674M
[4] => 98%
[5] => 0
[6] => 0
[7] => /dev/disk1s1
[8] => /Volumes/LUMIX
)
但是,如果我安装的磁盘卷名称包含空格,则会添加灾难发生并增加额外的数组值:
[/dev/disk4] => Array
(
[0] => /dev/disk4
[1] => 4.0T
[2] => 1.2T
[3] => 2.8T
[4] => 29%
[5] => 140741078
[6] => 347553584
[7] => /dev/disk4
[8] => /Volumes/My
[9] => Passport
[10] => Pro
)
有人可以帮我解决这个问题吗?我不熟悉sed和命令行实用程序......
答案 0 :(得分:1)
好吧,卷名永远是最后一个字段,你知道有多少字段(9),所以我只想在空格上拆分并要求那么多字段。不用担心任何sed
/ awk
/ grep
/ tr
这些东西,因为您已经处于一个完整的编程系统中,可以更有效地执行这些命令在自己的流程空间内。
首先,您可以将您想要信息的卷列表作为参数传递给df
,这意味着您不需要grep
:
$df = shell_exec('df -lH /Volumes/*');
现在拆分换行并删除标题:
$rows = explode("\n", $df);
array_shift($rows);
开始构建结果:
$result = array();
这里我们不需要使用shell实用程序,只是为了使explode
可以用preg_split
做的事情。正则表达式/\s+/
匹配一行中的一个或多个空白字符,因此我们不会获得额外的字段。限制(9)意味着它只分成9个字段,无论有多少个空格 - 所以最后一个字段中的空格(音量名称)单独留下。
foreach ($rows as $row) {
$cols = preg_split('/\s+/', $row, 9);
$result[$cols[0]] = $cols;
}
毕竟,$result
应该看起来像你想要的那样。