![如何在 bash 中使用命令行参数?](https://linux22.com/image/1107067/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%EF%BC%9F.png)
此脚本将所有 doc 文件移动到指定目录。我已设法输入参数,但我面临的问题是输入脚本要移动到的完整路径,例如,我想按以下方式运行脚本
./loo -d then path where im moving the files (i.e ./loo -d the second argument where files are moving to)
这是我的代码
#!/bin/bash
From="/home/elg19/lone/doc"
To="/home/elg19/documents"
if [ $1 = -d ]; then
cd "$From"
for i in pdf txt doc; do
find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
fi
答案1
您需要 getopts。getopts 是一个专门为您处理命令行参数的库,通常可用于多种语言。在 bash 中,您可以像这样使用它:
这是借用我找到的一个教程:
From="/home/elg19/lone/doc"
To="/home/elg19/documents"
while getopts "d:" optionName; do
case "$optionName" in
d) To="$OPTARG";;
[?]) exit 255;;
esac
done
[[ -d "$To" ]] || exit 255
cd "$From"
for i in pdf txt doc; do
find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
这尚未经过测试,但基本上它只是您的脚本,带有使用 getopts 覆盖“$To”参数的选项。
[?] 位告诉它如果发现任何无法识别的选项则退出。
答案2
FWIW,rsync 将为你完成此操作
rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/
如果你愿意,你可以在 .bashrc 中创建一个别名
alias backup='rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/'
如果您需要更多文件,例如 *.doc,请添加到 --filer="+ *.txt" ;)
如果你想调试你的脚本,请参阅我的评论。你的脚本中的问题可能和你的条件一样简单if [ $1 = -d ]
尝试
if [ -d "$1" ]; then
但是我无法从您的脚本中判断您传递了哪些选项以及为什么(您在脚本中定义了目录)。
答案3
使用您的最新评论
#!/bin/bash
From="/home/elg19/lone/doc"
#To="/home/elg19/documents"
while getopts "d:" optionName; do
case "$optionName" in
d) To="$OPTARG";;
[?]) exit 255;;
esac
done
[[ -d "$To" ]] || exit 255
for i in pdf txt doc; do
find $From -type f -name "*.${i}" -exec mv "{}" "$To" \;
done