如何在从命令行传递的参数中识别文件名参数



我知道如果我有一个命令./run -c -p '$' -s 10 file.txt
我可以写这样的bash脚本

while read line; do 
   # ...
done < $6

但是如果命令可能有也可能没有一个/一些选项,可能像这样

./run -p '$' -s 10 file.txt

或this

./run '$' -s 10 file.txt

那么我如何在脚本中获得文件名?

如果文件名总是出现在参数列表的末尾,则可以使用"${@: -1}"选择最后一个参数。摘自:https://stackoverflow.com/a/1854031/3565972

如:

while read line; do 
   ...
done < "${@: -1}"

使用getopts处理选项(也允许它们以任意顺序排列):

#!/usr/bin/env bash
while getopts cp:s: option; do
    case $option in
    c)
        echo "-c used"
        ;;
    p)
        echo "-p used with argument $OPTARG"
        ;;
    s)
        echo "-s used with argument $OPTARG"
        ;;
    *)
        echo "unknown option used"
        exit 1
        ;;
    esac
done
shift $(( OPTIND - 1 ));
echo "Arguments left after options processing: $@"

现在如果你运行这个:

$ ./test.sh -c -p '$' -s 10 file.txt
-c used
-p used with argument $
-s used with argument 10
Arguments left after options processing: file.txt

如果您想在脚本中获得文件名。然后,您可以使用$#来获得参数的总数。所以你可以这样写:

eval filename=$$#

如果您只是想从这样的行中获取文件名:./运行** ** ** ** file.txt

你可以像这样使用awk:

line="./run ** ** ** ** file.txt"
echo $line | awk '{print $NF}'

祝你好运!

相关内容

  • 没有找到相关文章

最新更新