我正在编写一个小脚本,它将从目录中为我选择随机文件,并使用所选文件名作为参数执行命令。
这是关于选择随机.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"