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で始まるエコーではパスは表示されませんが(したがってChoosenFile変数の内容は渡されません)、randomNumber変数の内容が表示されます!私は ''\と他の構文を試しましたが、成功しませんでした。

さらに重要なことは、コマンドを実行するとchooseFile変数の内容を見ることができないことです!私もいくつかの方法を試してみました。例えば

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]}

実際、良い練習をするには、変数を使用するときに二重引用符で囲む必要があります。これにより、シェルはユーザーが最も期待しない値の空白を計算しません。したがって、正しい行は次のようになります。

choosenFile="${allFilesInDirectory[randomNumber]}"

私はできます。強く使用をお勧めしますhttps://www.shellcheck.net/シェルスクリプトを確認するために使用されます。そのような場合は、スペルエラーを検出して警告します。

質問の2番目の部分については、行全体を二重引用符で囲まないでください。コマンドを作成し、必要に応じて変数を参照してください。たとえば、次のようになります。

sudo openvpn "$choosenFile"

関連情報