列出文件并将其存储在变量中

Dar*_*rio 5 shell shell-script variable

我是 shell 编程的新手。我的目标是让用户选择应该运行哪个文件。我在一个 var 中捕获所有可用脚本:

var=$(find script*)
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,这是输出:

    echo $var
    script1 script2 script3 scr...
Run Code Online (Sandbox Code Playgroud)

现在我想将每个文件存储在一个单一变量中,以便在以后的选择中运行它

select SEL in script1 script2 script3 ..........
case $SEL in
        $Script1) echo ($Script1 will start) && ./$script1 ;;
        $Script2) echo ($Script2 will start) && ./$script2 ;;
        $Script3) echo ($Script3 will start) && ./$script3 ;;
        $Sc..) echo ($Scr.... will start) && ./$scrip.... ;;
        $Sc...) echo ($Sc...... will start) && ./$scrip..... ;;
        *) echo "choose on of the availabel files";;
    esac
done
Run Code Online (Sandbox Code Playgroud)

如果我不知道每个文件的数量和确切长度,我不知道应该如何分隔所有文件。

我试图用 echo ${var[1]} 和 echo $var[1] 拆分,但这不起作用。我收到一个空输出或整个字符串。

Mic*_*mer 5

你的第一行:

var=$(find script*)
Run Code Online (Sandbox Code Playgroud)

只是制作var一个包含所有内容的字符串变量script*。它不是一个数组,所以我们不能[]像你想要的那样索引它。

script*实际上是由外壳扩展,所以find没有做任何事情存在(除非他们的目录,它看起来并不像他们) -它只是得到所有的文件名作为参数,它们存在的检查,并打印它们直再次退出。外壳实际上完成了所有工作..

相反,我们可以创建一个array,我们可以直接使用 shell 的glob 扩展来填充它:

files=(script*)
Run Code Online (Sandbox Code Playgroud)

当我们将初始化程序( 的右侧=)放在括号中时,我们正在创建一个数组,该数组分别保存多个值。script*将扩展到script当前目录中以开头的每个文件名。如果文件名中有空格,它们不会像$()数组初始值设定项中的命令(反引号或)那样导致单词被拆分。

此时我们可以读入一些用户输入:

select SEL in "${files[@]}"
do
    if ! [ "$SEL" ]
    then
        echo "Choose one of the available files."
        continue
    fi
    echo "$SEL will start"
    "./$SEL"
    break
done
Run Code Online (Sandbox Code Playgroud)

我们写入"${files[@]}"以干净地扩展我们的整个文件名数组以提供给select. 将向用户提供文件选择,然后我们进入do...done块。

如果$SEL为空,则用户选择了一个不存在的条目,因此我们打印提示并continue要求他们再次选择。

否则,我们echo会通知脚本将启动并运行脚本。我们引用名称"./$SEL"以防脚本名称中包含空格,否则会导致命令名称被视为./firstword,其余单词作为参数。break阻止我们返回并再次询问用户;如果你想这样做,把它拿出来。


case...of您使用似乎并没有在你给的例子多大的作用,但如果你确实有根据选择的脚本一些独立的行为(和它必须是在这个脚本),你可以把里面do...done块。


小智 1

不是 100% 确定我完全理解你想要做什么,但这对你来说可能会更好:而不是 var=$(find script*) 和一个你可以更好使用的案例

for i in `find script*`
do
        echo ($i will start) 
        ./$i
done
Run Code Online (Sandbox Code Playgroud)