linux - bash 中的 sed 不会产生预期的行为

标签 linux bash sed

<分区>

因为我在做一些 SDR 项目,但有时也想在我的电脑上看电视,所以我需要一个脚本来注释 modprobe 文件中的黑名单行,当我想使用 SDR 时,我需要取消注释这些行我想看电视。

所以我根据我在互联网上的多次阅读编写了一个脚本,但不幸的是它在我的机器上不起作用。 我希望你能帮我解决它。

请注意,单个 sed 命令确实有效(使用简单引号,因为在 bash 中我们需要双引号)

#!/bin/bash
# your target file
FILE="/etc/modprobe.d/blacklist-dvb.conf"

# comment target
comment() {
    sed -i "s/^/#/g" $FILE # comment all lines
}

# uncomment target
uncomment() {
    sed -i "s/^#//g" $FILE
}

然后我将脚本启动为:./my_script.sh 评论(或取消评论,视情况而定)

最佳答案

主要问题是您的脚本实际上没有做任何事情。它定义了一个变量和两个函数,然后就退出了。

如果您希望脚本检查命令行参数并调用相应的函数,则必须手动执行。

例如:

case "${1:?missing command argument}" in
  comment)   comment;;
  uncomment) uncomment;;
  *)         echo "$0: bad command: $1" >&2; exit 1;;
esac

其他说明:

  • 不要为您的 shell 变量使用 ALL_UPPERCASE。按照惯例,这些是为系统和 shell 本身保留的。更好:

    file="/etc/modprobe.d/blacklist-dvb.conf"
    
  • 作为一般规则,变量扩展应该被引用 ("$file"),除非您真的知道自己在做什么。

  • 您的正则表达式锚定到字符串的开头 (^)。 /g 标志毫无意义。

  • 一般来说,使用单引号比使用双引号更好。 '...' 的惊喜更少,因为一切都是按字面意思理解的:

    sed -i 's/^/#/' "$file"
    

    sed -i 's/^#//' "$file"
    

关于linux - bash 中的 sed 不会产生预期的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481430/

相关文章:

bash - 将字母放在 BASH 变量旁边

linux - 是否在/usr/local/lib 中搜索共享库?

linux - 使用 scp 从服务器下载文件时出错

linux - 如何确定分区的哪些扇区未使用?

linux - 如何将间隔添加到存储在变量中的日期/时间

python - 在不使用数据库软件的情况下从表中获取项目列表

linux - 如何在 bash 中编写一个返回 ASCII 字符而不使用 printf 的函数

regex - 使用AWK 在满足条件时提取数据?

regex - 在 unix 中提取特定出现的引号之间的字符串

linux - crontab 中没有 mdadm -D 输出