gpt4 book ai didi

bash - bash 中的参数或参数

转载 作者:行者123 更新时间:2023-11-29 09:49:14 27 4
gpt4 key购买 nike

我在 stackflow 上看到一个关于解析参数的问题。我试着写这个,但它不起作用,现在它让我很紧张。

通常在终端运行脚本的方式是./scriptname,不过后来我引入了参数-d。所以,如果我输入 ./scriptname 它就不会运行。如果我输入 ./scriptname -d 它会。

现在我想为路径添加另一个参数(文件移动的位置,在本例中为 "/home/elg19/documents"),这样当我不包含路径时,它不会跑。但是,如果我放置 ./scriptname -d path,我想用 -d 之后的命令参数替换现有脚本中的 $To

#!/bin/bash
From="/home/mark/doc"
To=$2

if [ $1 = -d ]; then
cd "$From"
for i in pdf txt doc; do
find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
fi

最佳答案

您想要的用法并不完全清楚,但似乎是:

scriptname -d path

因此,您可以采用可扩展方式或蛮力方式。由于您随意更改目录,因此还需要确保路径是绝对路径,而不是相对路径。

蛮力

#!/bin/bash
From="/home/mark/doc"
if [ $# = 2 ] && [ "$1" = '-d' ] && [ -d $2 ]
then
case "$2" in
(/*) cd "$From" &&
for extn in pdf txt doc
do find . -type f -name "*.$extn" -exec mv {} "$To" \;
done;;
(*) echo "$0: path name must be absolute ($2 is not)" 1>&2; exit 1;;
esac
else
echo "Usage: $0 -d /absolute/dirname" 1>&2; exit 1
fi

可扩展

#!/bin/bash
From="/home/mark/doc"
To=""

usage()
{
echo "Usage: $(basename $0 .sh) -d /absolute/dirname" 1>&2
exit 1
}

while getopts d: opt
do
case "$opt" in
(d) if [ ! -d "$OPTARG" ]
then echo "$0: $OPTARG is not a directory" 1>&2; exit 1
else
case "$OPTARG" in
(/*) To="$OPTARG";;
(*) echo "$0: path name must be absolute ($2 is not)" 1>&2; exit 1;;
esac
fi;;
(*) usage;;
esac
done
shift $(($OPTIND - 1))

if [ $# != 0 ] || [ -z "$To" ]
then usage
fi

cd "$From" &&
for extn in pdf txt doc
do find . -type f -name "*.$extn" -exec mv {} "$To" \;
done

例如,添加一个 -f from 选项来处理文件源的更改将非常容易。

请注意,您还可以使用:

for extn in pdf txt doc
do find "$From" -type f -name "*.$extn" -exec mv {} "$To" \;
done

这将允许您允许“从”和“到”目录的相对名称,因为它不会更改目录。

关于bash - bash 中的参数或参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558491/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com