【问题标题】:An script that accepts a command接受命令的脚本
【发布时间】:2009-11-21 03:06:26
【问题描述】:
#!/bin/sh
#My script

echo "Are you sure you want to reorganize your files?"
echo "Type y or Y to continue. Anything else will stop the process"
read response

if [ "$response" = "y" ] || [ "$response" = "Y" ]; then
  mkdir video
  mkdir audio
  mkdir text
  mv -v *.txt text >> log.txt
  mv -v *.wmv video >> log.txt
  mv -v *.mov video >> log.txt
  mv -v *.mpg video >> log.txt
  mv -v *.mp3 audio >> log.txt
  mv -v *.wma audio >> log.txt


  echo "Yay, it worked!"
else
echo "Nothing happened."
fi

我编写了上面的脚本来将文件组织到子文件夹中。例如,音乐文件将进入音频文件夹。现在我想更进一步,让它更全球化。我想允许脚本接受一个命令行参数,它是包含未组织文件的文件夹。这应该允许脚本在文件系统中的任何位置定位和运行,并接受任何无组织文件的文件夹。

例子:

organizefiles.sh mystuff/media // 子文件夹将进入“media”

文件夹 media 包含所有媒体文件。

谢谢!

【问题讨论】:

  • 一个可能的改进:mv -v *.{wmv,mov,mpg} video >> log.txt

标签: linux shell


【解决方案1】:

脚本的一部分可以像这样使用第一个位置参数:

if [ -d $1 ]
then
    mkdir video
    mkdir audio
    mkdir text
    mv -v $1/*.txt text >> log.txt
    mv -v $1/*.wmv video >> log.txt
    mv -v $1/*.mov video >> log.txt
    mv -v $1/*.mpg video >> log.txt
    mv -v $1/*.mp3 audio >> log.txt
    mv -v $1/*.wma audio >> log.txt
else
    echo "The destination directory does not exist"
    exit 1
fi

【讨论】:

  • 我在尝试使用时得到“目标目录不存在”
  • 您是否将其放在“if $response”行和“echo Yay”行之间?您是否以organizefiles.sh mystuff/media 运行脚本? “神秘/媒体”是否存在?实际上,现在我再次查看您的问题,我认为您想将 from $1 移动,因此我已相应地编辑了我的答案。
  • test.sh: 16: [[: not found 目标目录不存在这是我得到的错误。
  • 很抱歉,您使用的是 Bourne shell 而不是 Bash。试试[ -d $1 ] - 我已经编辑了我的答案。
  • 不用3 mkdir --> mkdir video text audio
【解决方案2】:

命令行参数可以参考$1、$2等,第一个是$1。下面是如何将参数传递给脚本的一个很好的描述:http://docsrv.sco.com:507/en/OSUserG/_Passing_to_shell_script.html

【讨论】:

    【解决方案3】:

    脚本可以通过以下变量访问命令行上的参数:

    $1, $2, ..., $n - refers to first, second up to n arguments.
    

    示例:键入 myscript.sh foo 会将 foo 设置为 $1 变量。

    【讨论】:

    • 我应该在脚本的哪个部分添加这些变量?
    • SOURCE_DIR=$1 # 在文件顶部,然后检查它是否存在。
    • 像这样:#!/bin/bash source = $1 mkdir movies mv -v $source/*.wmv movies >> log.txt mv -v $source/*.mov movies >> log .txt
    【解决方案4】:

    Bash 参数相当简单,使用$# 格式。例如,您可以使用 $1 从脚本访问命令行的第一个参数

    在你的脚本中,你可以这样做:

    if [ -z $1 ]
    then
       dir = $1
    else
       dir = './'
    fi
    

    然后只需将新的$dir 变量添加到mv 命令中的路径。我建议查看 IBM 的 Bash By Example。一个很棒的系列文章来教你 Bash。

    请注意,按照我的建议去做可能会有更好的选择,但我远不是 Bash 专家。 :-)

    【讨论】:

      【解决方案5】:

      这是一个简单的系统。您可以使用 case/esac 代替 if/else 以保持整洁。另外,重新排列了 mv 命令

      #!/bin/bash
      dir=$1
      cd $dir
      while true
      do
          echo "Are you sure you want to reorganize your files?"
          printf "Type y or Y to continue. Anything else will stop the process: "
          read response
          case "$response" in 
              y|Y ) 
                  mv -v *.txt text >> log.txt
                  for vid in "*.mov" "*.wmv" "*.mpg" "*.wma"
                  do
                      mv $vid video >> log.txt
                  done
                  echo "yay"
                  break;;
              *) echo "Invalid choice";;
          esac
      done
      

      【讨论】:

      • 所以“N”是“无效选择”?您要么在默认情况下需要break,要么需要n|N 情况(并更改提示的措辞),除非您不打算以“否”作为答案。你也可以cd $1 - 你不需要 $dir 变量。
      • 我不想中断,因为我想再次询问用户响应。另外,我不是使用这个菜单的人,如果他想要打破,OP 必须修改以满足他的需要,因此我不回答完全解决他的问题。我只想将 $1 命名为 $dir,有什么问题?它对我来说看起来很英语,也许我想在我的代码中再次使用 $dir ,并且我不想与循环中的另一个 $1 冲突??
      猜你喜欢
      • 2012-10-07
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多