首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在变量中使用带尾空格的值,以保留空格

在变量中使用带尾空格的值,以保留空格
EN

Ask Ubuntu用户
提问于 2021-01-02 10:35:16
回答 2查看 474关注 0票数 2

我通常可以在网上回答我的问题,但我的googlefu和理解让我这次失望了。

我有一个bash脚本,用于填充UDEV规则。为此,我使用了udevadm信息的grep,如下所示:

代码语言:javascript
复制
install_user=jlivin25
drive_number=sr1
env_ammend=CD
drive_model=$(udevadm info -a -n /dev/sr1 | grep ATTRS{model}==)

udev_insert=$(echo -e "ACTION==\"change\",KERNEL==\""$drive_number"\",SUBSYSTEM==\"block\","\"$drive_model"\",ENV{ID_CDROM_MEDIA_"$env_ammend"}==\"1\",ENV{HOME}=\"/home/"$install_user"\",RUN+=\"/bin/systemctl start "${env_ammend}_ripping.service"\"")

但是,我遇到的一个绊脚石是,udevadm info -a -n /dev/sr1 | grep ATTRS{model}==的结果给了ATTRS{model}=="BD-CMB UJ160 "

您可以在这里看到grep的结果包括尾随空格。一旦我将结果存储在一个变量中并尝试使用它,我就会失去空间。

互联网上的阅读解释说,""是用来阻止丢失的,如下所示:

echo $drive_model

给出

ATTRS{model}=="BD-CMB UJ160 "

echo "$drive_model"

给出

代码语言:javascript
复制
`ATTRS{model}=="BD-CMB UJ160    "`

但我似乎无法让它在UDEV中发挥作用。我得到的结果是:

代码语言:javascript
复制
ACTION=="change",KERNEL=="sr1",SUBSYSTEM=="block"," ATTRS{model}=="BD-CMB UJ160 "",ENV{ID_CDROM_MEDIA_CD}=="1",ENV{HOME}="/home/jlivin25",RUN+="/bin/systemctl start CD_ripping.service"

但我想要的是

代码语言:javascript
复制
ACTION=="change",KERNEL=="sr1",SUBSYSTEM=="block"," ATTRS{model}=="BD-CMB UJ160 
   ",ENV{ID_CDROM_MEDIA_CD}=="1",ENV{HOME}="/home/jlivin25",RUN+="/bin/systemctl start CD_ripping.service"

有人能帮我做这件事吗?我真的很想解释一下任何一个解决方案,这样我就能学到

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2021-01-02 11:31:22

与其他语言不同的是,bash从左到右读取引号。第一个引号设置后续字符的基础,这些字符将遵守其规则,直到匹配的引号终止引用为止。从这个意义上说,您可以说bash不嵌套引号。

示例:

代码语言:javascript
复制
'ACTION=="change",KERNEL=="'  "$drive_number"  '",SUBSYSTEM=="block",' ...
^ string one---------------^  ^ string two--^  ^ string three--------^

完整的行如下所示:

代码语言:javascript
复制
udev_insert='ACTION=="change",KERNEL=="'"$drive_number"'",SUBSYSTEM=="block",'"$drive_model"',ENV{ID_CDROM_MEDIA_'"$env_ammend"'}=="1",ENV{HOME}="/home/'"$install_user"'",RUN+="/bin/systemctl start '"${env_ammend}_ripping.service"\"

您还可以使用+=运算符来附加到变量:

代码语言:javascript
复制
udev_insert='ACTION=="change",KERNEL=="'
udev_insert+="$drive_number"
udev_insert+='",SUBSYSTEM=="block",'
...
票数 4
EN

Ask Ubuntu用户

发布于 2021-01-02 14:59:07

另外,在这里,printf是一个很好的选择,可以帮助引用以下内容:

代码语言:javascript
复制
user_home=$(getent passwd "$install_user" | cut -d: -f 6)
fmt='ACTION=="change",KERNEL=="%s",SUBSYSTEM=="block","%s",ENV{ID_CDROM_MEDIA_%s}=="1",ENV{HOME}="%s",RUN+="/bin/systemctl start "%s_ripping.service"'
printf -v udev_insert "$fmt" "$drive_number" "$drive_model" "$env_ammend" "$user_home" $env_ammend"
票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1304465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档