다음 스크립트를 실행하면 오류가 발생합니다. 이 문제를 해결하는 방법?
1 #!/bin/bash
2 # Show colored output if running interactively
3 if [ -t 1 ] ; then
4 export ANSIBLE_FORCE_COLOR=true
5 fi
6 # Log everything from this script into _quickstart.log
7 echo "$0 $@" > _quickstart.log
8 exec &> >(tee -i -a _quickstart.log )
9 # With LANG set to everything else than C completely undercipherable errors
10 # like "file not found" and decoding errors will start to appear during scripts
11 # or even ansible modules
12 LANG=C
[root@localhost quickstart_images]# sh quickstart.sh -u file:///usr/share/quickstart_images/undercloud-mitaka.qcow2 localhost
quickstart.sh: line 8: syntax error near unexpected token `>'
quickstart.sh: line 8: `exec &> >(tee -i -a _quickstart.log )'
[root@localhost quickstart_images]#
답변1
첫 번째bash
: 스크립트를 실행하는 대신 실행 가능하게 만듭니다.sh
chmod +x quickstart.sh
직접 실행해 보세요.
./quickstart.sh -u file:///usr/share/quickstart_images/undercloud-mitaka.qcow2 localhost
두번째: Bash 스크립트에 문제가 있는 것 같습니다.
스크립트를 실행하세요https://www.shellcheck.net/스크립트에 다음 오류가 보고됩니다.
Line 7:
echo "$0 $@" > _quickstart.log
^-- SC2145: Argument mixes string and array. Use * or separate argument.
당신이 직면하고 있는 문제는혼합 끈그리고대량으로.
다음 방법 중 하나를 사용하여 이 문제를 해결할 수 있습니다.
두 개의 서로 다른 따옴표로 구분된 인수를 사용하여 문자열과 배열을 혼합하지 마세요.
echo "$0" "$@" > _quickstart.log
또는
$@
다음으로 바꾸기는$*
배열을 문자열로 바꿉니다.echo "$0 $*" > _quickstart.log
$@
다음의 차이점을 참고하세요 $*
.
($*)
1부터 시작하는 위치 매개변수로 확장됩니다. 확장이 큰따옴표 안에 있지 않으면 각 위치 인수가 별도의 단어로 확장됩니다. 이러한 단어는 실행되는 컨텍스트에서 단어 분할 및 경로 이름 확장이 추가로 적용됩니다. 큰따옴표 내에서 확장이 발생하면 IFS 특수 변수의 첫 번째 문자로 구분된 각 인수의 값을 사용하여 단일 단어로 확장됩니다..즉, "$*"는 "$1c$2c..."와 같습니다., 여기서 c는 IFS 변수 값의 첫 번째 문자입니다. IFS가 설정되지 않은 경우 매개변수는 공백으로 구분됩니다. IFS가 비어 있으면 매개변수를 연결할 때 구분 기호가 삽입되지 않습니다.
($@)
1부터 시작하는 위치 매개변수로 확장됩니다.큰따옴표 내에서 확장이 발생하면 각 인수가 별도의 단어로 확장됩니다. 즉, "$@"은 "$1" 및 "$2"와 동일합니다....단어 내에서 큰따옴표 확장이 발생하는 경우 첫 번째 인수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 인수의 확장은 원래 단어의 마지막 부분과 연결됩니다. 위치 인수가 없으면 "$@" 및 $@는 아무것도 확장되지 않습니다(즉, 삭제됩니다).