如何使用单个变量获取多个输入?

时间:2018-08-24 12:25:31

标签: bash

我正在编写Multiboot脚本,但陷入一点混乱,我编写了这样的函数,

  

读取-p“将iso拖放到终端上:” isofile1

现在我应用了这样的条件:当按下Enter键时,就像传递的那样,它将移至下一部分,但是我想将$ isofile中的所有iso文件存储到不同的增量变量中,我想使用单个变量获取多个变量,以任何方式实现它?

我尝试了

$isofile1==$(isofile1+1) and different ways but no luck...

我想要isofile1 =第一个输入,isofile2 = 2nd输入,依此类推,直到没有输入...

编辑:我现在使用了另一种方法,我只是将所有输入回显到tempfile,现在我只想使用head -n 1从该文件中获取每一行,并将其放在rsync将执行iso文件副本的文件位置在USB中,将所有行逐一放入复制文件的变量中的任何线索 ??

2 个答案:

答案 0 :(得分:0)

尝试一下:

read -p "Drag & drop the iso's on Terminal : " isofiles
> iso1 iso2 iso3 ...
for iso in $isofiles; do
    echo "$iso"
done

答案 1 :(得分:0)

获得“带有单个变量的多个变量”的最简单方法是使用数组。如果我理解正确,则您正在尝试在单行输入中读取文件路径的列表,并将每个文件路径放入不同的变量中。更好的方法可能是使每个文件路径成为数组中的单独元素。 read命令可以使用-a选项执行此操作。这段代码

read -r -p "Drag & drop the iso's on Terminal : " -a isofiles

将读取包含多个文件路径的行,并将第一行放在${isofiles[0]}中,第二行放在${isofiles[1]}中,依此类推。

如果通过在终端窗口上放置文件来创建文件列表,则可能有问题。当我在Linux系统上进行测试时,我发现终端窗口中引用了文件路径。上面的代码在设置数组元素时将保留引号字符。如果任何路径包含空格字符,它也会获得不正确的路径。如果需要正确处理输入中带引号的文件路径,则需要更详细的代码。

为回答问题中的EDIT,示例Bash代码从名为“ tempfile”的文件逐行读取文件列表并将其复制到名为“ destdir”的目录中是

while IFS= read -r file || [[ -n $file ]] ; do
    cp -- "$file" destdir
done <tempfile

使用IFS=意味着文件路径中可以包含空格字符。将-rread一起使用可避免文件路径中的反斜杠字符出现问题。 [[ -n $file ]]测试意味着即使输入文件(tempfile)中的最后一个文件没有终止,代码也可以正常工作。

请参阅BashFAQ/001(“我如何逐行(和/或逐字段)读取文件(数据流,变量)?”)以获取有关逐行读取输入的更多信息。在Bash中在线。