Linux bash脚本:组合var=$(…)和var=${var%%…}行?

Linux bash脚本:组合var=$(…)和var=${var%%…}行?,linux,bash,Linux,Bash,是否可能,如果可能,如何将以下表达式转换为一个线性表达式 DEV=$(lsblk -no KNAME,MODEL | grep 'ModelNAME') DEV=${DEV%%'ModelNAME'} 简单的DEV=${(lsblk-无KNAME,MODEL | grep'ModelNAME')%%'ModelNAME}不起作用zsh允许您组合参数扩展。Bash没有 对于bash或posixsh(两者都支持此特定的参数扩展),您需要将其作为两个单独的命令来执行 也就是说,还有其他选择。例如:

是否可能,如果可能,如何将以下表达式转换为一个线性表达式

DEV=$(lsblk -no KNAME,MODEL | grep 'ModelNAME')
DEV=${DEV%%'ModelNAME'}

简单的
DEV=${(lsblk-无KNAME,MODEL | grep'ModelNAME')%%'ModelNAME}
不起作用

zsh允许您组合参数扩展。Bash没有

对于bash或posixsh(两者都支持此特定的参数扩展),您需要将其作为两个单独的命令来执行


也就是说,还有其他选择。例如:

# tell awk to print first field and exit on a match
dev=$(lsblk -no KNAME,MODEL | awk '/ModelNAME/ { print $1; exit }')
…或者更简单(但需要bash或其他现代ksh衍生产品):

#读取grep返回的第一行的第一个字段;#是其他字段的占位符

read-r dev<正确,它没有。不,您不能在bash中任意组合参数扩展。如果确实需要,您可以编写一行命令来执行相同的操作。也可以用
替换换行符如果您只想将它们放在一条可视线上。这里真正的目标是什么?lsblk的输出是什么?不知道,模型| grep'ModelNAME'
?@BenjaminW。它输出smth。类似于
sda DEVICE\u MODEL
,但我只需要
sda
:通过其modelBTW查找设备节点,所有caps名称都保留给系统或shell专用的变量;请参阅的第四段,记住shell变量和环境变量共享一个名称空间。
# read first field of first line returned by grep; _ is a placeholder for other fields
read -r dev _ < <(lsblk -no KNAME,MODEL | grep -e ModelNAME)