2016-08-01 53 views
0

我需要读取命令行参数。第一个参数是脚本名称。第二个是重定向操作符,即“<”,第三个是输入文件名。当我尝试使用“$#”时,我得到0.当我使用“$ *”时,它没有给我任何东西。我必须使用“<”这个操作符。我的输入文件由所有用户输入数据组成。如果我不使用操作员,它会要求用户输入。有人可以帮帮我吗?谢谢 !在bash中使用输入重定向操作符读取命令行参数

命令行:

./script_name < input_file 

脚本:

echo "$*"  # gave nothing 
echo "$#"  # gave me 0 

我需要读取输入文件名,并将其存储到一些变量。然后我必须改变它的扩展。任何帮助/建议,应该感激。

+0

'./script_name input_file',然后'echo $ 1'。 – bishop

+0

我必须从我的输入文件中读取所有行。它具有所有的用户输入。如果我不使用该操作员,它会提示用户输入。 – Rock26

+2

显示你的脚本,或等效的例子,所以我们可以看到它从标准输入 – chepner

回答

2

当用户运行:

./script_name <input_file 

...这是相当于正是,如果他们做了以下内容:从input_file

(exec <input_file; exec ./script_name) 

...第一重定向标准输入,然后调用脚本名为./script_name没有任何参数

您可以使用操作系统特定的接口来获取与句柄关联的文件名(如果有的话),但使用其中一种会使您的脚本只能在操作系统上运行,接口;这不值得。

# very, very linux-specific, won't work for "cat foo | ./yourscript", generally evil 
if filename=$(readlink /proc/self/fd/0) && [[ -e $filename ]]; then 
    set -- "[email protected]" "$filename" # append filename to the end of the argument list 
fi 

如果你想在给出的参数,以避免提示输入,并有这样的说法的文件名,然后不采取它在标准输入,但作为一个参数,并做脚本内重定向自己

#!/bin/bash 

if [[ $1 ]]; then 
    exec <"$1" # this redirects your stdin to come from the file 
fi 

# ...put other logic here... 

...并让用户调用你的脚本:

./script_name input_file 

正如./yourscript <filename运行yourscriptfilename它的标准输入的内容,脚本用./yourscript filename它调用exec <"$1"执行该命令后,将具有filename它的标准输入的内容调用。

+0

谢谢@charles。它工作得很好。我感谢你的帮助和时间。 – Rock26

1

<用于输入重定向。而且任何在<的右边都不是命令行参数。

所以,当你做./script_name < input_file时,会有零(0)命令行参数传递给脚本,因此$#将为零。

为了您puprpose你需要打电话给你的脚本:

mv -- "$1" "${1}_new_extension" 

编辑

./script_name input_file 

而在你的脚本,你可以用类似改扩建这哪里是什么OP想要做。


虽然已经有了另一个答案,但为了完整起见,我会写出这个答案。如果你使用'<'重定向,你可以在你的脚本中做这样的事情。

while read filename; do 
mv -- "$filename" "${filename}_bak" 
done 

并将脚本称为./script < input_file。但是请注意,在这种情况下,您将无法从stdin中接受输入。

+0

需要更多引号(即''mv - “$ 1”“$ {1} _new_extension”')。 '--'对于支持以破折号开头的文件名是必要的。 –

+0

@CharlesDuffy好点。我编辑过。虽然看起来OP正在尝试做其他事情,如现在所讨论的评论中所见.. – sps

+0

谢谢@sps。我无法删除“<”运算符。如果我这样做,脚本会提示用户输入。我不希望用户提供输入,因为它已经存在于input_file中。 – Rock26

相关问题