다음과 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
하면 제공 할 수있는만큼 많은 연속 \n
ewline으로 구분 된 숫자를 읽고 $max
wo 중 작은 값에 따라 값 또는 입력 각각에 대해 인쇄합니다 .
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
있는 몇 가지 다른 것 외에도 매크로로 예리하게 만들 수 있습니다 . 제대로 배치하면 완벽하게 작동하는 작은 스크립트가 간단하게 조립됩니다.x
dc
dc
스택 에서 작동합니다 . 모든 입력 객체는 각각 마지막에 쌓입니다. 각각의 새로운 입력 객체는 마지막 상단 객체와 그 아래에있는 모든 객체가 추가 될 때마다 스택 아래로 아래로 밀립니다. 객체에 대한 대부분의 참조는 최상위 스택 값에 대한 것이며 대부분의 참조 는 스택의 최상위를 나타 냅니다 (아래에있는 모든 객체를 1 씩 끌어옵니다) .
메인 스택 외에도 (적어도) 256 개의 어레이가 있으며 각 어레이 요소에는 자체 스택이 제공됩니다. 나는 여기서 많이 사용하지 않습니다. 내가 할 수 있습니다 언급 한 바와 같이 그냥 문자열을 저장하기 l
원하는 경우를 OAD 및 전자 x
조건부 ecute을, 나는 s
찢어 $max
의 상단에서의 값을 m
배열입니다.
어쨌든,이 작은 부분은 dc
주로 쉘 스크립트가하는 일을 수행합니다. 일반적으로 표준 입력에서 매개 변수를 가져 오는 -e
것처럼 GNU-ism 옵션을 사용 dc
하지만 다음과 같이 수행 할 수 있습니다.
echo "$script" | cat - /dev/tty | dc
... $script
위 비트처럼 보이면.
다음과 같이 작동합니다.
lTx
-이것은 상단에 저장된 매크로를 l
무효화하고 x
ecutes T
(테스트를 위해, 나는 보통 그 이름을 임의로 선택합니다) .
z 0=?
- T
동부 표준시 다음 w 스택 깊이를 테스트 / z
스택이 비어있는 경우, 그리고 (0 객체를 보유하고 읽기) 가 호출 ?
매크로를.
? z0!=T q
- ?
매크로는 ?
dc
stdin에서 입력 라인을 읽는 내장 명령의 이름을 따서 명명 되었지만, 또 다른 z
스택 깊이 테스트를 추가 q
하여 빈 줄을 가져 오거나 EOF에 도달하면 전체 작은 프로그램을 사용할 수 있습니다 . 그러나 !
스택을 채우지 않고 대신 성공적으로 T
채우면 est를 다시 호출 합니다.
d lm<M
- T
EST는 것이다 d
스택의 상단과 uplicate과 비교 $max
(에 저장된 m
) . 경우 m
적은 값이, dc
부르는 M
매크로를.
s0 lm
- M
스택의 상단을 팝하여 더미 스칼라에 덤프합니다 0
-스택을 팝하는 저렴한 방법입니다. 또한 est 로 돌아 가기 전에 다시 l
소리를냅니다 .m
T
p
- 경우에 것을이 수단 m
스택의 현재 정상보다 적은 다음, m
그것을 대체 합니다 ( d
어쨌든, 그것의 uplicate)을 여기에있다 p
rinted는 다른이와 어떤 입력이되어 있었다하지 않는 p
대신 rinted.
s0
-나중에 ( p
스택을 팝하지 않기 때문에 ) 스택 상단을 0
다시 덤프 한 다음 ...
lTx
- 반복적으로 l
OAD T
추정 한 번 더 한 후 전자 x
ecute을 다시.
따라서이 작은 조각을 실행하고 대화식으로 터미널 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
명령으로 먼저 설정하면 임의의 정밀도 부동 소수점을 처리 할 수 있습니다 . 또한 i
nput 또는 o
utput radices를 독립적으로 변경할 수 있습니다. 때로는 예상치 못한 이유로 유용 할 수 있습니다. 예를 들면 다음과 같습니다.
echo 100000o 10p|dc
00010
... 먼저 dc
출력 기수를 100000으로 설정 한 다음 10을 인쇄합니다.