根据bash中的变量评估命令

根据bash中的变量评估命令

我正在编写一个小脚本,它将从目录中为我选择随机文件,并使用所选文件名作为参数执行命令。

这是关于选择随机.ovpn文件并运行sudo openvpn path_to_filename

Here is my script:
#!/bin/bash
allFilesInDirectory=(/etc/openvpn/*)
echo ${#allFilesInDirectory[@]}
randomNumber=$[RANDOM % ${#allFilesInDirectory[@]}]
echo $randomNumber
echo ${allFilesInDirectory[randomNumber]}
choosenFile=${allFilesinDirectory[randomNumber]}
echo $choosenFile
echo "CHOOSEN: ${choosenFile} AS A RANDOM WITH NUMBER ${randomNumber} OF ${#allFilesInDirectory[@]} "
echo ""
EXECUTE COMMAND HERE

首先,在以 CHOOSEN 开头的 echo 中,没有显示路径(因此没有传递 ChoosenFile 变量的内容),但显示了 randomNumber 变量内容!我尝试使用 ' " \ 和其他一些语法但没有成功。

更重要的是,执行我的命令也看不到变量choosenFile的内容!我也尝试过几种方法。比如说

command="sudo openvpn ${choosenFile}"
eval $command

"sudo openvpn ${choosenFIle}"

"sudo openvpn \${choosenFIle}"

"sudo openvpn $choosenFIle"

最多我得到了 openvpn 帮助输出,因此没有传递变量 ChoosenFile 的内容。

有人可以指出我缺乏知识吗?我刚开始使用 bash 脚本。

答案1

您的变量名称有拼写错误。

这:

choosenFile=${allFilesinDirectory[randomNumber]}

应该:

choosenFile=${allFilesInDirectory[randomNumber]}

实际上,为了良好的实践,您应该在使用变量时用双引号引起来。这样,当您最不期望的时候,shell 就不会计算值中的空格。所以正确的行应该是这样的:

choosenFile="${allFilesInDirectory[randomNumber]}"

我会强烈地推荐你使用https://www.shellcheck.net/用于检查您的 shell 脚本。当它发生时,它会发现你的拼写错误并警告你。

至于问题的第二部分,只需停止对整行进行双引号即可。编写命令并在需要的地方引用变量,例如如下所示:

sudo openvpn "$choosenFile"

相关内容