我通常可以在网上回答我的问题,但我的googlefu和理解让我这次失望了。
我有一个bash脚本,用于填充UDEV规则。为此,我使用了udevadm信息的grep,如下所示:
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"
给出
`ATTRS{model}=="BD-CMB UJ160 "`但我似乎无法让它在UDEV中发挥作用。我得到的结果是:
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"但我想要的是
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"有人能帮我做这件事吗?我真的很想解释一下任何一个解决方案,这样我就能学到
发布于 2021-01-02 11:31:22
与其他语言不同的是,bash从左到右读取引号。第一个引号设置后续字符的基础,这些字符将遵守其规则,直到匹配的引号终止引用为止。从这个意义上说,您可以说bash不嵌套引号。
示例:
'ACTION=="change",KERNEL=="' "$drive_number" '",SUBSYSTEM=="block",' ...
^ string one---------------^ ^ string two--^ ^ string three--------^完整的行如下所示:
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"\"您还可以使用+=运算符来附加到变量:
udev_insert='ACTION=="change",KERNEL=="'
udev_insert+="$drive_number"
udev_insert+='",SUBSYSTEM=="block",'
...发布于 2021-01-02 14:59:07
另外,在这里,printf是一个很好的选择,可以帮助引用以下内容:
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"https://askubuntu.com/questions/1304465
复制相似问题