다음과 같은 매우 짧은 Bash 스크립트가 있습니다.
variable="3 things"
if $(echo $variable|grep "^[0-9]\{1,\}") #if $variable begins with [0-9]
then
echo $(echo $variable|sed 's/ .*$//')
else
echo "0"
fi
$variable
결국 명령의 출력은 숫자 또는 "No"라는 단어로 시작하는 문자열이 됩니다. 스크립트가 숫자만 반환하도록 하고 그렇지 않으면 숫자 0을 반환합니다.
오류가 발생하고 script.bash: line 2: 3: command not found
bash가 "3"을 명령으로 실행하려고 하는 이유를 이해할 수 없습니다. 어떤 통찰력이라도 대단히 감사하겠습니다(또는 이것을 작성하는 더 나은 방법에 대한 제안 - 저는 bash 스크립팅에 능숙하지 않습니다).
감사해요
답변1
이 시도:
variable="3 things"
if echo "$variable" | grep "^[0-9]\{1,\}" >/dev/null 2>&1 #if $variable begins with [0-9]
then
echo "$variable" | sed 's/ .*$//'
else
echo "0"
fi
이 $(...)
기호를 사용하면 내부 명령을 실행하고 해당 명령의 출력을 해당 위치에 배치하는 것입니다. 이 명령은 if
이 명령의 출력을 실행하고 성공하는지 확인합니다. 이 경우에는 실제로 $(...)
.
답변2
귀하의 스크립트가 실행을 시도하지 않습니다.바꾸다.
"grep"의 출력을 수행하려고 합니다...
그렇게 하려는 이유삼, if command
스크립트에서 발생한 것과 동일한 이유입니다. 이 명령은 if
..를 통해 종료 코드를 실행하고 테스트합니다. grep 출력이 if 3
bash에 표시됩니다.
if command ;then do-something; fi
if
테스트된 종료 코드 로 인해 문제가 없습니다 command
. 명령이 아니기
if 3 ; then do-somethin; fi
때문에 실패합니다 3
... 다음은 이를 나타내는 간단한 예입니다.if command...
function error() { return 1 ; }
if error ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# `if 3` fails as you already know..
# output:
A-cond2
B-cond1
이 모든 것을 쉽게 방지하고 "sed"가 조건부 테스트 및 출력을 처리하도록 할 수 있습니다.
for var in \
"3 things" \
" 1 leading space" \
"10 green bottles" \
"albatross"
do
echo "$var" |sed -e "s/^\([0-9]\+\).*/\1/" \
-e "s/^[^0-9].*/0/"
done
산출:
3
0
10
0