Bash 스크립트가 변수를 실행하려고 합니다.

Bash 스크립트가 변수를 실행하려고 합니다.

다음과 같은 매우 짧은 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 foundbash가 "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 3bash에 표시됩니다.

if command ;then do-something; fiif테스트된 종료 코드 로 인해 문제가 없습니다 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

관련 정보