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