我正在尝试在我用来记录的另一个闪存驱动器上创建一个文件夹,其中插入媒体设备的标签和 uuid 作为其名称。我有以下代码:
LOGDEVICELABEL=FLASHDRIVENAME
MD=`lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d'`
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR
问题是变量的值$MD
在开头有一个空格,我无法摆脱它。该空格导致 mkdir 将/media/$LOGDEVICELABEL/Log/
和$MD
视为两个单独的参数。
我试过:
MDLOGDIR=`sed 's/ // g' <<</media/$LOGDEVICELABEL/Log/$MD`
它仅删除 UUID 和 Label 之间的空格(这也是必要的),但不会删除/media/$LOGDEVICELABEL/Log/
和之间的空格$MD
。
答案1
我要做的一件事是用来echo
去除不需要的空白。在这种情况下,省略任何引号很重要:
LOGDEVICELABEL=FLASHDRIVENAME
MD=$(lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d')
MD=$(echo $MD) # <-- This line
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR
shell 调用该echo
命令并向其提供一系列标记,该echo
命令将打印这些标记,并用空格字符分隔。这样做的效果是 (1) 跳过前导和尾随空白,以及 (2) 将标记之间的一个或多个空白字符转换为单个空格。
在这种情况下,我使用$(...)
代替反勾号版本相当于反勾号版本。一般来说,我觉得这个版本更容易阅读。它还有一个很好的好处,即它可以嵌套 ( $(...$(...))
) ,而反引号版本则不能嵌套。
答案2
为什么不使用“参数扩展”之类的
MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD# }
MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD/ }
或扩展sed
类似
s /^ //