我正在尝试编写bash脚本,该脚本将读取多个文件名和一个目标目录,这是可选的。
./myfile -t /home/users/ file1 file2
我尝试了以下代码,但无法处理以下提到的不同情况:
while getopts "t:" opt; do
case $opt in
t)
echo "-t was triggered, Parameter: $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
exit 1
;;
:)
echo "Option -$OPTARG requires an argument."
exit 1
;;
esac
done
但是代码应处理不同的情况,例如:
./myfile file1 file2 -t /home/users/
,
./myfile file1 -t /home/users/ file2 file3
,
./myfile file1 file2 file3 file4
并且应该能够读取文件。
答案 0 :(得分:0)
在这种情况下,使用while
循环到read
和shift
的参数可能会更容易。
在下面的示例中,循环遍历参数以查找字符串-t
,在这种情况下,arguments数组被移了一步,现在nr 1索引应该是可选的homedir。在所有其他情况下,该项目将移动到另一个名为files
的数组中。
#! /bin/bash
files=()
homedir=
while (( $# > 0 )); do
case "$1" in
-t )
shift
homedir="$1"
;;
* )
files+=("$1")
;;
esac
shift
done
echo "${files[@]}"
echo "$homedir"
答案 1 :(得分:0)
在while
循环之后,您需要shift
删除所有选项及其参数。即使没有任何标志/标志争论,此方法也有效。
shift $(($OPTIND - 1))
然后其余的参数在"$@"
中可用,并且可以用任何常用的方式来处理。例如:
for arg in "$@"
do
something_with "$arg"
done
有关更多信息,请参见我的答案here。