“太多的参数”检查条件并执行某些操作,以防它不是真的?

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

如果条件为真,则继续使用其余的脚本。 如果condition不成立,则脚本静默编辑/添加行: %sudo ALL=(ALL:ALL) NOPASSWD: ALLsudoers文件中的%sudo ALL=(ALL:ALL) NOPASSWD: ALL ,保存然后继续使用脚本的下一部分。

所以我开始使用代码编写函数:

 ... #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; 

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

  1. “bash cookbook”是一个很好的资源,你可以在线获得基础知识,但是当你按下时间时,这将节省你的屁股。

  2. 永远不要在你打算成为字符串的东西上使用双引号,例如不受bash替换,因此passput line应该是单引号。

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

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

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

  3. 在CLI上设置-x或将-x传递给#!/ bin / bash以协助调试,有关详细信息,请参阅帮助集

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