bash:如何识别从命令行传递的参数中的filename参数?

时间:2014-05-25 23:16:36

标签: bash unix command-line-arguments

我知道我是否有命令./run -c -p '$' -s 10 file.txt
我可以像这样编写bash脚本

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

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

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

或者

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

然后我如何在脚本中获取文件名?

3 个答案:

答案 0 :(得分:3)

如果文件名始终位于参数列表的末尾,则可以使用"${@: -1}"选择最后一个参数。取自:https://stackoverflow.com/a/1854031/3565972

例如:

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

答案 1 :(得分:3)

使用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

答案 2 :(得分:0)

如果您想在脚本中获取文件名./run。然后你可以使用$#来获取参数的总和。 所以你可以写如下:

eval filename=\$$#

如果您只想从以下行获取文件名:./ run ** ** ** ** file.txt

你可以使用如下的awk:

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

祝你好运!