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] 拆分,但这不起作用。我收到一个空输出或整个字符串。
你的第一行:
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)