프로그램(lynx)에서 반환된 값으로 변수를 설정하려고 합니다. 목표를 달성하기 위해 어떤 괄호나 괄호를 사용하는지 지나칠 수 없습니다.
나는 이것을 가지고있다:
DEBFILE=${(lynx -listonly -dump https://gridtracker.org/release.html) | grep .deb | grep nwjs | awk '{ print $2 }'}
어떻게 속일 수 있습니까? 진정하세요. 내가 이것을 엉망으로 만든 지 꽤 시간이 지났습니다.
URL을 포함하도록 설명을 단순화했습니다. 궁극적으로 이 코드 블록 내에서 URL 변수도 사용하고 싶습니다.
예를 들어...
DEBFILE=${(lynx -listonly -dump ${GT_DOWNLOAD_LINK} ) | grep .deb | grep nwjs | awk '{ print $2 }'}
내 스크립트 시작 부분에 이미 정의되어 있기 때문입니다.
나는 그것을 줄로 나누고 명령을 파일에 에코한 다음 그런 식으로 다시 변수로 읽기 때문에 이것이 구문 문제라는 것을 알고 있습니다.
이게 효과가 있어
echo $(lynx -listonly -dump https://gridtracker.org/release.html | grep .deb | grep nwjs) | awk '{ print $2 }' >> temp.txt
DEBFILE=$(cat temp.txt)
echo $DEBFILE
답변1
변수 확장 및 명령 대체에 대한 혼동으로 인해 중첩된 구문 오류가 발생했을 수 있습니다.
당신이 달성하고 싶은 것은명령 대체DEBFILE
, 즉 변수 에 할당하고 싶습니다.산출명령. 이는 다음과 같이 수행됩니다.
DEBFILE=$( your command )
${ ... }
초기 시도에서 사용한 구문은 다음과 같습니다.매개변수/변수 확장, 여기서 이름이 중괄호로 묶인 쉘 변수를 "역참조"할 수 있습니다. 이는 ${VARIABLE}
기본적으로 와 동일 $VARIABLE
하므로 표시되는 첫 번째 명령에 대해 쉘은 다음과 같은 변수를 찾으려고 시도합니다.이름이고 그 값을 (1)(lynx -listonly -dump https://gridtracker.org/release.html) | grep .deb | grep nwjs | awk '{ print $2 }'
에 할당합니다 DEBFILE
.
목표를 달성하는 올바른 방법은 다음과 같습니다.
DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | grep .deb | grep nwjs | awk '{ print $2 }')
--pipe를 다음과 같은 단일 명령으로 대체할 수도 있습니다 grep
.grep
awk
awk
DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | awk '/\.grep/ && /nwjs/ { print $2 }')
또는
DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | awk '(index($0,".deb") && index($0,"nwjs")) { print $2 }')
노트"This Works"라고 표시한 코드는 기본적으로 제가 제안한 것과 정확히 일치합니다. 단지 echo
출력을 파일에 쓰고 그 파일에서 다시 변수를 읽는 불필요한 중간 단계만 거치면 됩니다 $DEBFILE
.
echo $(lynx ... | grep .deb | grep nwjs)
lynx ... | grep .deb | grep nwjs
기본적으로 파이프의 콘솔 출력을lynx ... | grep ... | grep ...
매개변수로 만들어echo
간단히 콘솔에 (다시) 인쇄하므로 동일한 효과가 있지만 불필요한 공백 형식 재지정이 발생할 수 있습니다.echo $(lynx ... | grep .deb | grep nwjs) | awk '{ print $2 }'
그래서 ,lynx ... | grep .deb | grep nwjs | awk '{ print $2 }'
(1) Stéphane Chazelas가 지적했듯이 ksh93
일부 형태의 명령 대체는 실제로 지원되지만 ${ cmd; }
명령이 a로 끝나야 하며 ;
POSIX와 호환되지 않으며 Bash는 이를 지원하지 않습니다.