繁体   English   中英

Bash 脚本 || sed 命令

[英]Bash scripting || sed command

如果字符串匹配,我正在尝试在一行前面添加#。 字符串将由用户读取。 直接sed命令对我来说很好,但是当用户读取命令时它会抛出错误:

server cust01-stg01-ins01-wfm13-bck-610358970-22.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-25.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-21.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-23.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-24.int.stg.mykronos.com:80 resolve max_fails=0;

现在假设用户想要评论带有匹配字符"cust01-stg01-ins01-wfm13-bck-610358970-22" ,那么下面是 output

#server cust01-stg01-ins01-wfm13-bck-610358970-22.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-25.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-21.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-23.int.stg.mykronos.com:80 resolve max_fails=0;
server cust01-stg01-ins01-wfm13-bck-610358970-24.int.stg.mykronos.com:80 resolve max_fails=0;


sudo sed -i "/cust01-stg01-ins01-wfm13-bck-610358970-23/s/^/#/" wfm_backend_nginx.state

这对我来说效果很好,但是当我尝试使用以下命令时,它会抛出错误。

[root@cust01-stg01-ins01-wfm13-bck-ilb1-610358970 tmp]# cat ilb_commnet.sh
#!/bin/bash -xe
sudo read -p "enter host_name :" Host
sudo sed -i -e "/${Host}/s/^/#/" /tmp/wfm_backend_nginx.state

Output 是:

sed: -e expression #1, char 0: no previous regular expression
sudo read -p "enter host_name:" Host

sudo运行一个单独的进程,它将读取输入并将其保存到Host中。 然后进程将退出,用读取的值破坏整个环境。

删除sudo - 读取当前进程中的值。

在这里使用sudo完全是疯狂的。 您正在一个特权子 shell 中运行read ,然后它会退出并带上变量,然后您才能将它用于任何事情。

...实际上sudo read只是一个语法错误,因为sudo无法运行 shell 内置。 它试图寻找/usr/bin/read/bin/read等,但没有找到任何东西。

bash$ sudo read -p hello
sudo: read: command not found

即使没有sudo ,您的代码也应该在尝试将变量传递给特权命令之前检查该变量。 也许像

#!/bin/bash -xe
while true; do
    read -p "Enter host name: " Host
    case $Host in
      *[!A-Za-z0-9]*) echo "$0: Invalid characters in host name" >&2;;
      *) break
    esac
done
sudo sed -i -e "/${Host}/s/^/#/" /tmp/wfm_backend_nginx.state

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM