BASH / shell脚本,blkid失败,驱动器标签中有换行符

时间:2011-11-23 18:18:53

标签: bash shell sed eval

我有一个在Linux上运行的BASH / shell脚本,但有时使用blkid获​​取驱动器标签时出现问题.. blkid获​​取驱动器标签和给定驱动器的UUID。

blkid输出示例:

# blkid /dev/sda1
/dev/sda1: LABEL="Home" UUID="f1e5e82b-1c75-4fd7-8841-6ad766152dcf" TYPE="ext2"

当驱动器标签有换行符时出现问题...我已经包含了相关功能。问题似乎与eval命令有关。有人可以帮助我吗?

blkid_name_generator() {
   #Gather blkid output and filter out required device
   if [ ! -f /tmp/blkid.txt ]; then
      blkid -c /dev/null > /tmp/blkid.txt
   fi
   blkid_cleaner &
   LABEL=""
   LABEL1=""
   eval $( cat /tmp/blkid.txt | grep "$@:" | cut --delimiter=" " -f 2- | sed -e 's/ /;/g')
   LABEL1=${LABEL//;/ } # akita beta4 fix: remove newlines below
   LABEL=`echo $LABEL1 | tr -d '\n'` # akita beta5 fix, remove newlines from drive label
   #Generate drive label
   [ "$LABEL" = "" ] && ONEDRVLABEL="$@\n \n " || ONEDRVLABEL="${LABEL}\n($@)\n "
   echo "${LABEL}" and "${ONEDRVLABEL}"
} 

blkid_name_generator /dev/sda1

3 个答案:

答案 0 :(得分:1)

这是我的bash片段:

while read curline; do
  if [[ ${curline:0:1} == "/" ]]; then
    [[ $prevline ]] && echo "$prevline"
    prevline="$curline"
  else
    prevline+="$curline"
  fi
done < $INPUTFILE

[[ $prevline ]] && echo "$prevline"

这是我的测试文件:

/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2"
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4"
/dev/sda3: LABEL="Usr" UUID="ba759de3-e0e4-4603-a324-f11dc25fa784" TYPE="reiserfs"
/dev/sdb1: LABEL="Persis
tents" UUID="50b81ef0-a38b-4677-b9d9-9548b29ce2bb" TYPE="ext4"
/dev/sdc1: LABEL="Tempo
raries" UUID="a649c535-1a8a-4b2b-b0a0-4afbdc60a3bc" TYPE="reiserfs"
/dev/sdd1: LABEL="Usr
Portage" UUID="a228148e-6405-4bbe-990f-df6eaebb1b1d" TYPE="reiserfs"
/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2"
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4"

这是我的测试文件,经过bash片段处理后:

/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2"
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4"
/dev/sda3: LABEL="Usr" UUID="ba759de3-e0e4-4603-a324-f11dc25fa784" TYPE="reiserfs"
/dev/sdb1: LABEL="Persistents" UUID="50b81ef0-a38b-4677-b9d9-9548b29ce2bb" TYPE="ext4"
/dev/sdc1: LABEL="Temporaries" UUID="a649c535-1a8a-4b2b-b0a0-4afbdc60a3bc" TYPE="reiserfs"
/dev/sdd1: LABEL="UsrPortage" UUID="a228148e-6405-4bbe-990f-df6eaebb1b1d" TYPE="reiserfs"
/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2"
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4"

希望这有帮助!

答案 1 :(得分:0)

我没有看到您的脚本打算做什么(除了缺少的位)。

以下是我提出的建议:

blkid | perl -ne 'print "$1\n" if m/LABEL="(.*?)"/o'

它会显示(在我的系统上):

test^J123
WIN7VIRT
TEMP

请注意标签中的换行符是如何描述为^J的?通过十六进制编码器查看显示它确实是一个双字符组合0x5e 0x4a

希望你能进一步了解它。


PS:'证明'换行实际上正确地在卷标

tune2fs /dev/sdc1 -l
tune2fs 1.41.14 (22-Dec-2010)
Filesystem volume name:   test
123
Last mounted on:          /media/9868d90c-aede-4e7a-b105-d9312f8b17ab
Filesystem UUID:          9868d90c-aede-4e7a-b105-d9312f8b17ab
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
...

和块级别:

dd if=/dev/sdc1 count=10 | xxd | grep 123
0000470: b105 d931 2f8b 17ab 7465 7374 0a31 3233  ...1/...test.123

答案 2 :(得分:0)

感谢这个问题......我可以找到另一个问题的解决方案。示例(sda2 = ntfs分区):

blkid / dev / sda2

分段错误(核心转储)

很难找到此问题的故障排除指南(基于ubuntu的操作系统或其他任何内容)

背后的原因是NTFS分区中的LABEL格式错误。 (当然,我们不能看到形成错误,作为换行;-) 解决方案:使用GParted清除LABEL;然后重写它或设置一个新的LABEL。