将文件名传递给具有自动完成功能的脚本

将文件名传递给具有自动完成功能的脚本

通常,当我在脚本中使用文件名时,我会在脚本中明确提及文件名,例如如下所示,

#!/bin/bash ... echo "<dynamic text>" >> process_log.log ...

我想知道是否可以将文件名传递给脚本,如下所示:

./script_name.sh file_1 file_2 file_3

具有选项卡自动完成功能。 (这样就很方便了!)

有没有人有这方面的经验。谢谢。


read是询问一些输入数据的一种方法,但我觉得对于多个输入和长文本来说很麻烦。

答案1

好的,该脚本采用一个强制参数和两个可选参数。如果您未指定至少一个参数,它将退出(并出现错误)。除此之外并没有太多作用!

#!/bin/sh
if [ -z "$1" ]
then
    echo "Missing filename: 1"
    exit 1
else
    file1=$1
fi
file2="$2"
file3="$3"
printf "File 1: %s\n" "$file1"
printf "File 2: %s\n" "$file2"
printf "File 3: %s\n" "$file3"
cat "$file1"

将其另存为(例如)script_name.sh并将其设置为可执行文件:

chmod u+x script_name.sh

然后像这样运行它:

./script_name.sh script_name.sh script_name.sh script_name.sh

它应该显示您传递给它的三个参数(都是“script_name.sh”),然后是cat它本身。

当我尝试这个时,我尝试了制表符补全 - 它自动工作得很好(当我按下 时它显示文件和目录Tab)。我没有做任何事情让它这样做。但是,如果您只想让脚本处理某些文件complete -f -X '!*.png' script_name.sh- 当您按 时,只会显示“.png”文件Tab

编辑添加:

complete不是从脚本本身运行(script_name.sh在上面的示例中)。创建一个单独的文件(completion_for_script_name.sh例如):

complete -f -X '!*.png' script_name.sh

用于source将完成加载到当前环境中:

source ./completion_for_script_name.sh

通常,您可以在 shell 的配置文件中执行此操作,例如.bash_profile.bashrc

相关内容