Linux 输入string命令以运行另一个.sh文件bash脚本

Linux 输入string命令以运行另一个.sh文件bash脚本,linux,bash,shell,Linux,Bash,Shell,我尝试将一些文件复制到给定的输入。 首先,我在终端中输入一个类似“*.txt”,然后我必须发送另一个.sh文件 read -p "Write input " input6 bash ./prog.sh -R $input6 但是./prog.sh工作错误,它给出了一个错误: cp: cannot stat '"*.txt"': No such file or directory" 如果我这样写: bash ./prog.sh -R &q

我尝试将一些文件复制到给定的输入。
首先,我在终端中输入一个类似
“*.txt”
,然后我必须发送另一个.sh文件

 read -p "Write input " input6
 bash ./prog.sh -R $input6
但是./prog.sh工作错误,它给出了一个错误:

cp: cannot stat '"*.txt"': No such file or directory"
如果我这样写:

 bash ./prog.sh -R "*.txt"
正确。文件被复制

有什么问题?你怎么认为?有什么建议吗

我不明白
$input6
“*.txt”
有什么不同

我必须使用菜单。为了运行我的程序,我将命令发送到另一个.sh文件


顺便说一句,我的老师想用双引号输入,比如“*.txt”

听起来你在对提示的响应中键入了双引号。您不应该这样做,因为引号在展开变量后不会被处理,所以它们会被逐字处理。由于没有任何以双引号开头和结尾的文件名,因此通配符匹配将失败

相反,在将变量用作脚本参数时,应该引用该变量

bash ./prog.sh -R "$input6"
然后响应提示,只需输入
*.txt
,而不是
“*.txt”

如果确实需要输入双引号,则需要使用
eval
来处理它们

eval "bash ./prog.sh -R $input6"

但是,这是危险的,因为您可以输入将由
eval

执行的命令。这应该可以解决您的问题:

read -p "Write input " input6

bash ./prog.sh -R $(echo $input6 | xargs)

另外,我认为更好的方法是不允许在输入字符串中使用引号

引用变量
“$input6”
,尽管当您不引用时,脚本应该接收通配符的扩展作为其参数。如果当前目录中没有
.txt
文件,它将只接收
*.txt
作为参数。在这种情况下,它的作用应该与引用变量相同。所以我认为你不应该收到那个错误信息。这听起来像是
prog.sh
中有一个引用错误。我们看不到该代码,因此不可能告诉您任何更有用的信息。请参阅这里的@tripleee,它不可能是引用错误,因为在将参数传递给脚本之前,通配符将被展开。这与以下密切相关:我试图在变量中放入命令,但复杂的情况总是失败!--正如上面所描述的,在Barmar的回答中,一个无引号的扩展只经过有限的解析步骤子集;它的行为方式与代码中的内容不同。这是一件好事——如果数据被神奇地当作代码处理,你就永远无法编写处理不可信数据的安全代码。它再次出现错误。-->“cp:cannotstat'*.txt':没有这样的文件或目录”,这是因为
$input6
中有引号。我告诉过你,不要输入引号。这与我的硬件有关,我的老师想输入双引号,如“.txt”。所以,我不能使用*.txt。即使我像你说的那样使用,也会产生同样的错误。但是如果我直接输入bash./prog.sh-R“.txt”,它会起作用。我已经更新了答案,说明如何使用
eval
处理双引号。@codetime1,在
/prog.sh-R“*.txt”
中,引号在启动
prog.sh
之前被删除——它们是您键入命令的shell的指令(告诉它不要用当前目录中的.txt文件列表替换
*.txt
),而不是
prog.sh
接收的参数的一部分。这就是为什么如果在命令行中使用引号是正确的,那么在输入
read
$(echo$anything | xargs)的值中使用相同的引号是错误的
是一个非常糟糕的主意。如果
*.txt
包含一个名为
two words.txt
的文件,则将
two
words.txt
作为单独的参数传递。它还可能会遇到中描述的所有问题,否则会产生比它解决的问题更多的问题。此外,OP希望传递文本字符串
*.txt
到他们的程序中;这根本不能做到这一点。@CharlesDuffy我确信这是OP想要的。我的错。@CharlesDuffy会的,因为
$input6
包含
“*.txt”
,它与任何内容都不匹配,所以它会被逐字传递。但最好使用
echo“$input6”
printf“%s\n'$input6”
@Barmar,在调用xargs时,如果没有
-d
-0
;如果给定
“*.txt”,则会取消引用值
,它将输出
*.txt
,因此当命令替换的输出展开到
prog.sh
的命令行时,glob将展开。哦,他需要引用命令替换,以防止额外的通配符表达式。