Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 接受命令的脚本_Linux_Shell - Fatal编程技术网

Linux 接受命令的脚本

Linux 接受命令的脚本,linux,shell,Linux,Shell,我编写了上面的脚本来将文件组织到子文件夹中。例如,音乐文件将进入音频文件夹。现在我想更进一步,使它更全局化。我想允许脚本接受命令行参数,即包含无组织文件的文件夹。这应该允许脚本在文件系统中的任何位置定位和运行,并接受任何包含无组织文件的文件夹 例如: organizefiles.sh mystuff/media//子文件夹将放在“media”中 介质文件夹包含所有介质文件 谢谢大家! 您可以将命令行参数引用为$1、$2等。第一个参数是$1。下面很好地介绍了如何将参数传递给脚本:脚本可以通过以下变

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

例如:

organizefiles.sh mystuff/media//子文件夹将放在“media”中

介质文件夹包含所有介质文件


谢谢大家!

您可以将命令行参数引用为$1、$2等。第一个参数是$1。下面很好地介绍了如何将参数传递给脚本:

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

#!/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
if [ -z $1 ]
then
   dir = $1
else
   dir = './'
fi

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

Bash参数非常简单,使用的是
$\code>格式。例如,您可以使用
$1
从脚本访问命令行的第一个参数

在脚本中,您可以这样做:

$1, $2, ..., $n - refers to first, second up to n arguments.
然后只需将新的
$dir
变量添加到
mv
命令的路径中。我建议从IBM签出。教你Bash的一个很棒的系列文章


请注意,按照我的建议做可能有更好的方法,但我在Bash方面还远远不是专家。:-)

脚本的一部分可以使用第一个位置参数,如下所示:

#!/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
if [ -z $1 ]
then
   dir = $1
else
   dir = './'
fi

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

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

我应该在脚本的哪一部分添加这些变量?SOURCE_DIR=$1#在文件的顶部,然后检查它是否存在。像这样:#/bin/bash source=$1 mkdir movies mv-v$source/*.wmv movies>>log.txt mv-v$source/*.mov movies>>log.txtA可能的改进:mv-v*{wmv,mov,mpg}video>>log.txtI在我尝试使用它时得到“目的地目录不存在”您是否将其放在“if$response”行和“echo Yay”行之间?您是否以
organizefiles.sh mystuff/media
的身份运行脚本?“mystuff/media”是否存在?事实上,现在我再次看你的问题,我想你想从$1开始移动,所以我相应地编辑了我的答案。test.sh:16:[[:未找到目标目录不存在,这是我得到的错误。很抱歉,你使用的是Bourne shell而不是Bash。请使用
[-d$1]进行尝试
-我已经编辑了我的答案。没有必要使用3 mkdir-->mkdir视频文本音频,因此“N”是一个“无效选择”?在默认情况下,您需要一个
中断
,或者您需要一个
N | N
情况(并更改提示的措辞),除非您不打算接受“否”回答。您也可以
cd$1
-您不需要$dir变量。我不想中断,因为我想再次询问用户的响应。此外,我不是使用此菜单的人,OP必须修改以满足其需要,如果他想中断或不中断,因此我不回答以准确解决他的问题。我只想将$1命名为$dir,有什么问题吗?在我看来它是英文的,也许我想在代码中再次使用$dir,例如,我不想与循环中的另一个$1冲突??