“太多参数”检查条件并在其不成立时执行某些操作?

“太多参数”检查条件并在其不成立时执行某些操作?

我已编辑sudoers文件以允许非 root 用户运行sudo命令而无需输入密码。在 中vim,如何创建一个函数来检查此条件是否为真,如果不为真,则提示用户是否希望脚本编辑并保存文件sudoers以使此条件为真?

如果条件为真,则继续执行脚本的其余部分。如果条件不为真,则脚本会默默地%sudo ALL=(ALL:ALL) NOPASSWD: ALL在文件中编辑/添加行: sudoers,保存,然后继续执行脚本的下一部分。

因此我开始使用以下代码编写函数:

... #lines 1-5
passChk() {
passPut="%sudo ALL=(ALL:ALL) NOPASSWD:ALL";
passRd=sudo grep -is "$passPut" --file=/etc/sudoers;
if [ $passRd == $passPut ]; then #if sudoers already contains line from $passPut,     
                                 #exit passChk and proceed to pkgFetch.
   pgkFetch;
else
   echo "You will be prompted for user password. Do you want to temporarily disable this?"; 
   read answer;
fi
if [ $answer !="y" ] || [ $answer !="n" ]; then null
elif [ $answer ="y" ]; then
   $passPut|tee -a > /etc/sudoers
elif [ $answer ="n" ]; then
   pkgFetch;
fi;
clear;
};
passChk;

我在第 9 行收到错误if [ $passRd = $passPut ]; then pkgFetch; [: too many arguements。我不明白。我正在尝试测试目录中是否$passRd包含来自的字符串$passPut。我做错了什么?

答案1

  1. “Bash 食谱”是一种极好的资源,你可以从网上获得基础知识,但当你时间紧迫时这会节省你的时间。

  2. 永远不要对你想要作为裸字符串的内容使用双引号,例如不受 bash 替换的内容,因此 passput 行应该用单引号引起来。

  3. 在测试结构 []、[[ ]]、(()) 等中,始终使用双引号引用变量引用。如果不这样做,可能会发生不好的事情,请仔细阅读。首选结构是:

[ “${passRd}” = “${passPut}” ]
  1. 函数调用后的分号是不必要的,并且会使代码变得混乱。

  2. 男人测试,测试调用中的每个参数之间必须有空格。

  3. 在 CLI 上设置 -x 或将 -x 传递给 #!/bin/bash 以协助调试,请参阅帮助集了解详情。

答案2

这本书可能是学习 Ubuntu 中的 Bash 脚本的最佳资源。

相关内容