#!/bin/bash
function thous {
numfmt --g $1 | sed 's/,/./g;s/@//g'
}
aa="1,235"
bb="5,22"
cc=$(echo "$aa + $bb" | bc)
#1
echo $aa
#2
echo $bb
#3
echo $(thous "$cc")
#4
echo "SKIP"
exit
무엇이 보여지는가
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
내가 원하는 건
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
(some error or nothing at all)
SKIP
이 bash 쉘 코드를 컴파일하려고 하면 #3에 갇히게 됩니다. 그렇다면 처리할 수 없는 것을 무시하고 다음 프로세스를 계속하도록 터미널에 어떻게 지시합니까?
질문이 불분명하다면 알려주세요. 감사합니다.
답변1
스크립트가 중지되면 실제로 numfmt
입력을 기다리는 중입니다. 스크립트 Ctrld를 누르면 계속됩니다.
numfmt
이는 옵션이 아닌 인수가 제공되지 않고 $cc
비어 있는 경우 표준 입력이 형식화되기 때문에 발생합니다 .
이러한 블록을 방지하는 일반적인 기술은 numfmt
블록을 읽게 만드는 것입니다 /dev/null
.
numfmt --g $1 < /dev/null | sed 's/,/./g;s/@//g'
바라보다첫 번째 반복 후에 이 while 루프가 종료되는 이유는 무엇입니까?이 기술이 얼마나 유용한지에 대한 또 다른 예입니다.
그러나 특정 상황에 따라 더 나은 접근 방식은 다음과 같습니다.변수 참조; 비어 있더라도 numfmt
항상 매개변수가 있습니다 .$1
numfmt --g "$1" | sed 's/,/./g;s/@//g'
또한 스크립트에서 옵션 약어를 사용하지 않아야 합니다. --g
향후 버전의 스크립트에서 "g"로 시작하는 또 다른 긴 옵션이 도입되면 문제가 발생할 수 있습니다. numfmt
이렇게 할 때 매개변수에서 옵션을 분리해야 합니다 --
(그렇지 않으면 numfmt
음수 값이 거부됩니다).
numfmt --grouping -- "$1" | sed 's/,/./g;s/@//g'
그러면 스크립트가 완료될 때까지 중단 없이 실행됩니다. 계산을 결정하면 $cc
예상 결과가 동시에 출력되고 "$1"
변형이 표시됩니다 .
numfmt: invalid number: ‘’