不在空格处分割

不在空格处分割

我想获取两个命令的输出 –

zpool list
zfs list

对于每个找到的池:

zpool get all nameofpool

对于每个找到的文件系统:

zfs get all nameoffilesystem

背景和环境

我正在对 OS X 不可或缺的脚本进行本地更改,

/usr/bin/sysdiagnose

  • #!/bin/sh对于初学者
  • 始终以超级用户权限运行
  • 有时实际上是无头的(由一个关键和弦触发),因此输出的一定是文件。

第一次实验

根据示例#65 删除所有 ZFS 快照

#!/bin/sh
for dataset in `zfs list -H | cut -f 1`
do
  zfs get all $dataset
done

这可行,但是不是数据集名称中有空格。例如,文件系统的zhandy/Pocket Time Machine输出包括:

cannot open 'zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine': dataset does not exist

 第二个实验

… 基于这个问题的第一个答案 – 使用IFS– 并使脚本更像 Apple 的。参见修订 4

第三次实验

根据该问题的公认答案 – 用IFS、 和 引号表示"$dataset"

#!/bin/sh
data_directory_path=~/Desktop
ECHO=/bin/echo
ZFS=/usr/sbin/zfs
ZPOOL=/usr/sbin/zpool
# If there exists a zfs binary, get some ZFS information
if [ -f "${ZFS}" ]
then
    "${ECHO}" "Recording ZFS pool version information ..."
    "${ZPOOL}" upgrade &> ${data_directory_path}/zpool\ upgrade.txt
    "${ECHO}" "    listing all ZFS pools ..."
    "${ZPOOL}" list &> ${data_directory_path}/zpool\ list.txt
    "${ECHO}" "    detailed health status and verbose data error information ..."
    "${ZPOOL}" status -v &> ${data_directory_path}/zpool\ status.txt
    "${ECHO}" "    pools that are available but not currently imported"
    "${ZPOOL}" import &> ${data_directory_path}/zpool\ import.txt
    "${ECHO}" "Recording ZFS file system version information ..."
    "${ZFS}" upgrade &> ${data_directory_path}/zfs\ upgrade.txt
    "${ECHO}" "    listing all ZFS file systems ..."
    "${ZFS}" list &> ${data_directory_path}/zfs\ list.txt
    "${ECHO}" "    all properties of each file system"
    OLD_IFS=$IFS
    IFS=$'\n'
    for dataset in `zfs list -H | cut -f 1`
    do
        "${ZFS}" get all "$dataset" &> ${data_directory_path}/ZFS\ file\ system\ properties.txt
    done
    IFS=$OLD_IFS
    "${ECHO}" "Listing the contents of /dev/dsk"
    "${LS}" -@adel /Volumes &> ${data_directory_path}/ls-dev-dsk.txt
    "${ECHO}" "Listing the contents of /var/zfs/dsk"
    "${LS}" -@adel /Volumes &> ${data_directory_path}/ls-var-zfs-dsk.txt
fi

在生成的文件中,ZFS file system properties.txt列出仅ZFS 文件系统...名称中带有空格的数据集。

最理想的最终结果是属性:

  • 对于所有 ZFS 文件系统
  • 在一个文件中。

删除以下字符串 –

&> ${data_directory_path}/ZFS\ file\ system\ properties.txt

– 在终端窗口中获​​取所有 ZFS 文件系统的属性,但在文件中却没有。这足以让我接受答案。


输出到文件标准,这在我的第一版问题中没有出现,但可以在其他地方轻松找到答案。

答案1

不在空格处分割

bash 的for循环默认在所有空格字符处拆分参数。您可以以某种方式转义每一行 - 或者简单地切换到另一个分隔符。cut每行将返回一个值,因此我们可以选择中间的换行符。

注意中的双引号zfs get all,这样每个$dataset也不会被分开。

#!/bin/bash
IFS=$'\n'
for dataset in `zfs list -H | cut -f 1`
do
  zfs get all "$dataset"
done

重置 IFS

之后,您可能希望重置IFS为之前的值,并将其存储到某个临时变量中。

OLD_IFS=$IFS
# the whitespaces-sensitive lines
IFS=$OLD_IFS

相关内容