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/쉘 스크립트를 확인하는 데 사용됩니다. 그런 일이 발생하면 철자 오류를 발견하고 경고합니다.

질문의 두 번째 부분에 대해서는 전체 줄을 큰따옴표로 묶지 마세요. 명령을 작성하고 필요한 경우 변수를 참조하십시오. 예를 들면 다음과 같습니다.

sudo openvpn "$choosenFile"

관련 정보