점(.)이 포함된 명령줄 인수를 어떻게 전달합니까? 점과 같은 문자를 캡처하는 이스케이프 시퀀스가 있나요?
셸에서 다음 bash 스크립트를 호출하면 작동하지 않습니다.
# ./deploy.sh input.txt
./deploy.sh: line 9: input.txt: syntax error in expression (error token is ".txt")
나는 다음을 시도했습니다 :
- 백슬래시
- 인용하다
- 큰따옴표
- ./deploy.sh 입력(작동함)
편집하다
다음 사용 사례를 예로 들어 보겠습니다.
- 3개의 파일이 있습니다: server.jar client.jar gui.jar
- 원본에서 대상으로 SCP를 지정해야 합니다.
- 소스 디렉터리: login1@host1:/home/xyz/deploy/
- 대상 디렉터리: login2@host2:/data/apps/env/software/binary/
해결책:
- 배열에 복사할 아티팩트를 명령줄에서 읽습니다.
- 올바른 디렉터리 접두사를 사용하여 대상 경로 및 소스 경로 문자열을 만듭니다.
- for 루프를 사용하여 각 아티팩트를 scp합니다(경로 찾기).
다음은 1(아티팩트를 배열로 읽기)을 수행하는 간단한 스크립트입니다.
#!/bin/bash
declare -a artifacts
for i
do
artifacts[i]=$i
echo ${artifacts[i]}
done
1을 실행
-bash-3.00$ ./simple.sh arg1 arg2 arg3
arg1
arg2
arg3
실행 2
-bash-3.00$ ./simple.sh arg1.txt arg2.txt arg3.txt
./simple.sh: line 7: arg1.txt: syntax error in expression (error token is ".txt")
답변1
declare -A
대신 을 사용해야 합니다 declare -a
. 분명히 임의의 문자열 매개변수가 있는 연관 배열을 인덱스로 사용하고 있지만 declare -a
이는 정수 인덱스 배열에서만 작동합니다. arg.txt
유효한 정수로 평가되지 않으므로 오류가 발생합니다.
편집하다
버전 3을 사용하고 계신 것 같습니다 bash
. 안타깝게도 버전 4까지는 연관 배열을 사용할 수 없었습니다. deploy.sh
다른 사람들로부터 대안에 대한 아이디어를 얻을 수 있도록 민감한 개인 정보를 제거한 원본 스크립트의 삭제된 버전을 게시하는 것이 좋습니다 .
편집 2
채팅에서 주고받은 일부 내용을 간략하게 요약하면 다음과 같습니다.
모든 매개변수에 대해 일부 작업을 수행하는 가장 간단한 방법은 루프를 사용하여 반복하는 것입니다 for
.
for arg; do
scp login1@host1:"$arg" login2@host2:/dest/
done
모든 인스턴스를 큰따옴표로 묶어야 합니다 "$arg"
. 당신은 그렇습니다아니요매개변수는 이미 배열에 있으므로 직접 배열에 넣어야 합니다 $@
. 이는 for
명시적으로 지정하지 않을 때 기본적으로 사용되는 것 입니다 in list...
.
답변2
이 오류는 숫자가 필요한 문자열을 사용하려고 할 때마다 발생합니다.
예를 들어
$((input.txt))
동일한 오류가 인쇄됩니다.
귀하의 경우에는 숫자로 인덱싱된 배열에 할당하고 있는 것으로 나타났습니다.
jw013 맞다설명하다declare -A
예제가 작동하려면 (대문자 A)를 수행해야 합니다 .
이유:
배열 요소에 할당할 때 다음과 같이 쓰는 것이 일반적입니다.
array[0]=foo
array[1]=bar
그러나 당신은 또한 무엇이든 쓸 수 있습니다산술 표현키로서, 예를 들면 다음과 같습니다.
array[0+0]=foo
array[1+0]=bar
그래서 껍질은 본다
array[input.txt]=input.txt
다음과 같은 숫자로 변환해 보세요.
$((input.txt))
그리고 실패.
요점이 혼란스럽고 요점 없는 주장이 타당해 보이는 이유는 다음과 같습니다.
$((input))
실제로 유효한 숫자입니다.
bash
을 보고 input
유효한 변수 이름인지 확인하고 변수가 설정되지 않았는지 확인한 후 로 바꾸십시오 0
.
와 비교하면 input.txt
변수 이름에는 점이 포함될 수 없으므로 유효한 변수 이름이 아닙니다!
이러한 혼란스러운 동작을 방지하려면 다음을 사용할 수 있습니다.
set -u
그러면 존재하지 않는 변수를 사용하려고 할 때마다 다음과 같은 오류가 발생합니다.
set -u
artifacts[arg1]=arg1
인쇄 오류
scriptname: line number: arg1: unbound variable