我试图在一行前添加#,如果字符串得到匹配。字符串将由用户读取。直接的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"
注释行,那么期望下面的输出
#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
输出为:
sed: -e expression #1, char 0: no previous regular expression
sudo read -p "enter host_name :" Host
sudo
运行一个单独的进程,它将读取输入并将其保存到Host
。然后进程将退出,破坏整个环境的读取值。
删除sudo
-读取当前进程中的值
在这里使用sudo
完全是疯狂的。您正在特权子shell中运行read
,然后该子shell退出并带走该变量,然后才能将其用于任何操作。
…实际上,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