다음과 dc같이 두 숫자 만 비교할 수 있습니다 .
dc -e "[$1]sM $2d $1<Mp"
... 여기서 "$1"최대 값 "$2"은보다 작은 경우 인쇄 할 숫자 "$1"입니다. 또한 GNU가 필요 dc하지만 다음과 같이 똑같이 할 수 있습니다.
dc <<MAX
[$1]sM $2d $1<Mp
MAX
위의 두 경우 모두에서 당신은 0 이외의 정밀도를 설정할 수 있습니다 (기본값) 등이 ${desired_precision}k. 모두를 위해 당신이 두 값이 있는지 확인하는 것도 필수적입니다 숫자가 확실히 있기 때문에 dc할 수 system()w / 호출 !연산자.
다음의 작은 스크립트 (및 다음 스크립트 ) 를 사용하면 입력을 확인해야 grep -v \!|dc합니다. 임의의 입력을 강력하게 처리 할 수있는 것입니다. 또한 dc음수는 _접두어가 아닌 접두사로 해석 -합니다. 후자는 빼기 연산자이기 때문입니다.
그 외에도이 스크립트를 사용 dc하면 제공 할 수있는만큼 많은 연속 \newline으로 구분 된 숫자를 읽고 $maxwo 중 작은 값에 따라 값 또는 입력 각각에 대해 인쇄합니다 .
dc -e "${max}sm
[ z 0=? d lm<M p s0 lTx ]ST
[ ? z 0!=T q ]S?
[ s0 lm ]SM lTx"
그래서 ... 그 각각의 [사각 괄호 ]한 확대는 것입니다 dc 문자열 입니다 오브젝트 S어느 하나 - 각각의 배열에 각각 aved T, ?또는이 M. 문자열 로 할 수 dc있는 몇 가지 다른 것 외에도 매크로로 예리하게 만들 수 있습니다 . 제대로 배치하면 완벽하게 작동하는 작은 스크립트가 간단하게 조립됩니다.xdc
dc스택 에서 작동합니다 . 모든 입력 객체는 각각 마지막에 쌓입니다. 각각의 새로운 입력 객체는 마지막 상단 객체와 그 아래에있는 모든 객체가 추가 될 때마다 스택 아래로 아래로 밀립니다. 객체에 대한 대부분의 참조는 최상위 스택 값에 대한 것이며 대부분의 참조 는 스택의 최상위를 나타 냅니다 (아래에있는 모든 객체를 1 씩 끌어옵니다) .
메인 스택 외에도 (적어도) 256 개의 어레이가 있으며 각 어레이 요소에는 자체 스택이 제공됩니다. 나는 여기서 많이 사용하지 않습니다. 내가 할 수 있습니다 언급 한 바와 같이 그냥 문자열을 저장하기 l원하는 경우를 OAD 및 전자 x조건부 ecute을, 나는 s찢어 $max의 상단에서의 값을 m배열입니다.
어쨌든,이 작은 부분은 dc주로 쉘 스크립트가하는 일을 수행합니다. 일반적으로 표준 입력에서 매개 변수를 가져 오는 -e것처럼 GNU-ism 옵션을 사용 dc하지만 다음과 같이 수행 할 수 있습니다.
echo "$script" | cat - /dev/tty | dc
... $script위 비트처럼 보이면.
다음과 같이 작동합니다.
lTx-이것은 상단에 저장된 매크로를 l무효화하고 xecutes T (테스트를 위해, 나는 보통 그 이름을 임의로 선택합니다) .
z 0=?- T동부 표준시 다음 w 스택 깊이를 테스트 / z스택이 비어있는 경우, 그리고 (0 객체를 보유하고 읽기) 가 호출 ?매크로를.
? z0!=T q- ?매크로는 ? dcstdin에서 입력 라인을 읽는 내장 명령의 이름을 따서 명명 되었지만, 또 다른 z스택 깊이 테스트를 추가 q하여 빈 줄을 가져 오거나 EOF에 도달하면 전체 작은 프로그램을 사용할 수 있습니다 . 그러나 !스택을 채우지 않고 대신 성공적으로 T채우면 est를 다시 호출 합니다.
d lm<M- TEST는 것이다 d스택의 상단과 uplicate과 비교 $max (에 저장된 m) . 경우 m적은 값이, dc부르는 M매크로를.
s0 lm- M스택의 상단을 팝하여 더미 스칼라에 덤프합니다 0-스택을 팝하는 저렴한 방법입니다. 또한 est 로 돌아 가기 전에 다시 l소리를냅니다 .mT
p- 경우에 것을이 수단 m스택의 현재 정상보다 적은 다음, m그것을 대체 합니다 ( d어쨌든, 그것의 uplicate)을 여기에있다 printed는 다른이와 어떤 입력이되어 있었다하지 않는 p대신 rinted.
s0-나중에 ( p스택을 팝하지 않기 때문에 ) 스택 상단을 0다시 덤프 한 다음 ...
lTx- 반복적으로 lOAD T추정 한 번 더 한 후 전자 xecute을 다시.
따라서이 작은 조각을 실행하고 대화식으로 터미널 dc에서 숫자를 입력하고 입력 한 숫자 또는 $max입력 한 숫자가 더 큰 경우 값을 인쇄 할 수 있습니다. 또한 모든 파일 (예 : 파이프) 을 표준 입력으로 받아들입니다. 빈 줄이나 EOF가 나타날 때까지 읽기 / 비교 / 인쇄 루프를 계속합니다.
그래도 이것에 대한 몇 가지 참고 사항-쉘 함수의 동작을 에뮬레이트하기 위해 이것을 작성 했으므로 한 줄에 하나의 숫자 만 강력하게 처리합니다. dc그러나 한 줄에 많은 수의 공백으로 분리 된 숫자를 처리 할 수 있습니다. 그러나 스택으로 인해 줄의 마지막 숫자가 첫 번째 dc줄이되어 줄어 듭니다. 따라서 한 줄에 두 개 이상의 숫자를 인쇄 / 입력하면 출력이 역으로 인쇄됩니다. 그것을 처리하는 것은 배열에 줄을 저장 한 다음 작동시키는 것입니다.
이처럼 :
dc -e "${max}sm
[ d lm<M la 1+ d sa :a z0!=A ]SA
[ la d ;ap s0 1- d sa 0!=P ]SP
[ ? z 0=q lAx lPx l?x ]S?
[q]Sq [ s0 lm ]SM 0sa l?x"
그러나 ... 나는 그것을 아주 깊이 설명하고 싶을 지 모른다. 로 말할 것으로 충분 dc스택 그것을 저장 값 또는 하나의 각 값을 판독 $max다시 한번 비어있는 스택을 검출하면, 그 후 다른을 판독하기 전에 각각의 인덱스 오브젝트를 인쇄 인덱스 배열에서의 값, 및 입력 라인.
그리고 첫 번째 스크립트는 수행하는 동안 ...
10 15 20 25 30 ##my input line
20
20
20
15
10 ##see what I mean?
두 번째는 :
10 15 20 25 30 ##my input line
10 ##that's better
15
20
20 ##$max is 20 for both examples
20
k명령으로 먼저 설정하면 임의의 정밀도 부동 소수점을 처리 할 수 있습니다 . 또한 input 또는 output radices를 독립적으로 변경할 수 있습니다. 때로는 예상치 못한 이유로 유용 할 수 있습니다. 예를 들면 다음과 같습니다.
echo 100000o 10p|dc
00010
... 먼저 dc출력 기수를 100000으로 설정 한 다음 10을 인쇄합니다.