새로운 .sh 스크립트를 시작하는 쉘 스크립트가 있습니다. 이제 첨자의 반환 값을 변수에 저장하고 싶습니다.
이 스크립트를 찾았습니다.
#!/bin/bash
r=1
while [[ r -ne 0 ]]
do
r=`vx $* < \`tty\` > \`tty\``
done
exit 0
매개변수를 사용하여 스크립트 vx를 호출하고 반환 값을 변수 r에 저장합니다. tty...은 무슨 뜻인가요? 이것이 반환 값입니까? $를 사용할 수 없나요? 값을 반환하려면?
감사해요!
편집하다:
그렇다면 다음 진술은 틀린 것인가요?
#!/bin/bash
returnvalue=1
while [ $returnvalue -ne 0 ]
do
bash ./vx $1
returnvalue=$?
done
답변1
나는 당신이 실제로 다음을 원한다고 믿습니다.
#! /bin/sh -
until rv "$@"; do
continue
done
$?
일반적으로 종료 상태( )의 실제 값을 가져올 필요가 없으며 0이 true인지 false를 의미하는지 알 필요도 없습니다. until
, while
, ... 구조로 if
이 문제를 해결할 수 있습니다. 위 내용은 continue
단지 가독성을 위한 것입니다. no-op 명령을 포함한 모든 명령을 여기에 넣을 수 있습니다 :
.
$*
따옴표를 사용 하거나 남기지 마십시오 $@
. 의미가 없습니다.
답변2
스크립트의 출력을 "r"에 저장하고 종료 코드는 $?에 저장됩니다.
그러니 "완료" 앞에 한 줄만 추가하세요.
result=$?
답변3
표현에 있어서
r=`vx $* < \`tty\` > \`tty\``
Bash는 이를 현재 스크립트에 전달된 모든 쉘 확장 인수( )를 전달할 vx
수 있는 실행 파일 이름으로 해석합니다. $*
예를 들어 스크립트의 인수가 이면 * `ls /dev`
vx에 전달되는 인수 목록은 현재 디렉터리에 있는 모든 파일의 이름에 를 더한 것입니다 /dev
. 인수 수는 파일 이름 수와 같습니다.
vx
표준 입력에서 입력이 허용된다고 가정합니다.
tty
Bash가 파일 이름으로 해석하는 문자열을 반환하는 실행 파일입니다.
첫 번째 호출은 tty
두 번째 호출과 다른 파일 이름을 반환할 수 있습니다. 예를 들어 tty
파일 이름이 일부 외부 조건(예: 이전 호출에서 생성된 이름을 가진 파일의 내용)을 기반으로 생성되거나 파일 이름이 다음과 같은 경우입니다. 타임스탬프 또는 변경될 수 있는 기타 외부 조건을 기반으로 생성됩니다.
이 표현식은 r=`...`
backtick 명령의 표준 출력을 에 할당합니다 r
. 백틱 표현식의 반환 값은 입니다 $?
.
의 표준 출력은 vx
두 번째 호출에서 생성된 파일 이름으로 리디렉션되므로 tty
의 값은 r
표현식에서와 마찬가지로 항상 비어 있습니다( ) r=
. 결과적으로 루프가 두 번 이상 실행되지 않습니다.r=0
[[ r -ne 0 ]]