如何在 bash 中使用命令行参数?

如何在 bash 中使用命令行参数?

此脚本将所有 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

相关内容