저는 디렉토리에서 임의의 파일을 선택하고 선택한 파일 이름을 인수로 사용하여 명령을 실행하는 작은 스크립트를 작성하고 있습니다.
이것은 임의의 .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"