【问题标题】:How can I create a command line (unix/linux) instruction that uses variables to execute numerous commands?如何创建使用变量执行大量命令的命令行 (unix/linux) 指令?
【发布时间】:2008-09-16 17:37:02
【问题描述】:

我需要重新排列各个目录中的一些内容,但这有点麻烦。为了调试我正在开发的应用程序(一个 ruby​​ 应用程序),我需要一次将一个 gem 移动到我的 gem 文件夹中(长话短说;简而言之:一个坏了,我不知道是哪一个)。

所以我需要做类似的事情:

sudo mv backup/gem/foo gem/
sudo mv backup/doc/foo doc/
sudo mv backup/specification/foo.gemspec specification/

每次都替换“foo”。如何编写一个简单的 shell 脚本来让我执行以下操作:gemMove("foo") 并为我填补空白?

【问题讨论】:

    标签: bash shell command-line


    【解决方案1】:

    将以下内容放入名为gemmove的文件中:

    #!/bin/bash
    
    if [ "x$1" == x ]; then
      echo "Must have an arg"
      exit 1
    fi
    
    for d in gem doc specification ; do 
      mv "backup/$d/$1" "$d"
    done
    

    然后做

    chmod a+x gemmove
    

    然后调用 sudo /path/to/gemmove foo 将 foo gem 从备份目录移动到真实目录中

    【讨论】:

      【解决方案2】:

      您可以简单地使用 bash shell 参数,如下所示:

      #!/bin/bash
      # This is move.sh
      mv backup/gem/$1 gem/
      mv backup/doc/$1 doc/
      # ...
      

      然后执行为:

      sudo ./move.sh foo
      

      确保脚本可执行,使用

      chmod +x move.sh
      

      【讨论】:

        【解决方案3】:

        在 bash 中,类似于:

        function gemMove()
        {
        filename=$1
           mv backup/gem/$filename gem/$filename
           mv backup/doc/$filename doc/$filename
           mv backup/specification/$filename.spec specification
        }
        

        那么你可以在脚本的其他地方调用gemMove("foo")

        【讨论】:

        • 或者您可以将该功能添加到您的 .bashrc 以使其始终可用。