한 줄에 쉘/bash에 변수를 할당하는 것을 포함하여 if...then 문에 대한 그룹 명령

한 줄에 쉘/bash에 변수를 할당하는 것을 포함하여 if...then 문에 대한 그룹 명령

내가 아는 존재완전한. 또는 다음을 사용할 수 있다는 것을 알고 있습니다.할 일 완료. 그러나 다음을 사용하여 수동으로 테스트하려고했습니다.if-then-else.

명령을 실행하고 싶지만 각 반복마다 추가 변환을 수행하고 싶습니다.

sh-3.2# currPos=0;stepSize=16;
sh-3.2# hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16
sh-3.2# hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
32
sh-3.2# hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
48
sh-3.2# 

보시다시피 offset( -s)는 변수의 업데이트된 값을 사용하지 않습니다 $currPos. 그러나 echo명령 에서는 $currPos변수가 변경됩니다( 16, 3248)!

편집 1: 에 따르면선행은 이루기가 어렵다(정말 감사합니다!) 첫 번째 단계를 수정했습니다.

sh-3.2# currPos=0;stepSize=16;finalStep=48;
sh-3.2# hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos;
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16
sh-3.2# hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos;
00000010  bd 04 00 00 00 00 00 00  01 00 00 80 00 00 00 00  |................|
00000020
32
sh-3.2# hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos;
00000020  4e 58 53 42 00 10 00 00  00 f4 01 00 00 00 00 00  |NXSB............|
00000030
48

다음을 사용해 보겠습니다.https://linuxize.com/post/bash-if-else-statement/ 일부: if, then, elsefi( -eq, -gt, -ge, -lt, -le, !=) 및 break.

반복 을 사용해보십시오 if.break

sh-3.2# currPos=0;stepSize=16;finalStep=48;
sh-3.2# if [ $currPos -le $finalStep ]; then (hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;); else break; fi
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16
sh-3.2# if [ $currPos -le $finalStep ]; then (hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;); else break; fi
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16
sh-3.2# if [ $currPos -le $finalStep ]; then (hexdump -n $stepSize -Cv /dev/disk0s1 -s $currPos;currPos=$(($currPos + $stepSize));echo $currPos;); else break; fi
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16

Note: 명령문의 명령(, 및)을 그룹화합니다 (.)hexdumpassignationechothenif

그러나 이 경우 echo첫 번째 경우가 가장 나쁘게 작동합니다(변수 값은 $currPos변경되지 않음).

이에 따르면기사{및 을 사용해야 합니다 }. 하지만 나는 다음을 얻습니다.

sh-3.2# if [ $currPos -le $finalStep ]; then {hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos;}; else break; fi
sh: syntax error near unexpected token `}'

어떻게 해야 합니까? , (변수의 업데이트된 값을 사용하지 않고) 이 문제를 해결하는 방법은 무엇입니까?

편집 2 스티븐 차제라스나를 도와 주었다! ( {및 에 대한 설명을 읽고 각각 of 뒤와 앞에 공백을 기록해 두십시오 }).{}

sh-3.2# currPos=0;stepSize=16;finalStep=48;
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
00000000  8d 1c 09 48 65 8c 3c 6e  01 00 00 00 00 00 00 00  |...He.<n........|
00000010
16
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
00000010  bd 04 00 00 00 00 00 00  01 00 00 80 00 00 00 00  |................|
00000020
32
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
00000020  4e 58 53 42 00 10 00 00  00 f4 01 00 00 00 00 00  |NXSB............|
00000030
48
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040
64
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
sh-3.2# 

세미콜론 테스트(가까운 else break):

sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos }; else break; fi
sh: syntax error near unexpected token `else'
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; }; else break; fi
sh-3.2# if [ $currPos -le $finalStep ]; then { hexdump -n $stepSize -Cv -s $currPos /dev/disk0s1;currPos=$(($currPos + $stepSize));echo $currPos; } else break; fi
sh-3.2# 

답변1

주요 문제는 옵션이 피연산자 앞에 지정되어야 한다는 것입니다. 편의를 위해 일부 GNU 도구는 이를 허용하도록 주어진 인수를 재배열하지만(사용자가 그것에 대해 생각할 필요가 없도록), hexdumpGNU가 아닌 시스템에서는 이 작업을 수행하는 도구 중 하나가 아닙니다.

따라서 설명서에 설명된 대로 이러한 도구를 사용하십시오. 이는 macOS 시스템에서 가져온 것입니다(FreeBSD 매뉴얼에도 동일한 내용이 있습니다):

hexdump [-bcCdovx] [-e format_string] [-f format_file] [-n length]
        [-s offset] file ...

즉, 명령줄을 다음과 같이 재정렬합니다.

hexdump -n "$stepSize" -Cv -s "$currPos" /dev/disk0s1

파일 이름 뒤에 옵션을 넣고 해당 -n옵션을 그대로 유지하고 hexdump모든 입력을 계속 읽으면 결국 -s옵션 인수를 읽을 파일 이름으로 사용하려고 시도하는 것을 볼 수 있습니다.

[...]
hexdump: -s: No such file or directory
hexdump: 12: No such file or directory

질문의 후반부는 다음과 같습니다.

  • in 값을 사용하면 명시적 하위 쉘 내(즉, 괄호 내)에서 업데이트하기 때문에 $currPos명령 호출 사이에 in 값이 업데이트되지 않습니다 . (...)상위 환경은 하위 셸 내에서 변경할 수 없으며 하위 셸 환경은 종료 시 삭제됩니다.

  • 사용시 { ...; }뒤에 공백이 있어야 합니다 {. {"복합 명령", 즉 여러 개의 다른 명령으로 구성된 명령을 소개하는 키워드 입니다 .

    일반적으로 셸 구문에 단일 명령(예: 파이프라인의 단일 단계)이 필요하거나 단일 리디렉션과 함께 여러 명령의 출력을 리디렉션하는 상황에서 이러한 복합 명령을 사용합니다.

    { ...; }if명령문의 and(or) 사이에 별도의 명령이 얼마든지 있을 수 있으므로 명령문 내에서 사용할 필요는 없습니다 .thenelsefiif

    if [ "$currPos" -le "$finalStep" ]; then
        hexdump -n "$stepSize" -Cv -s "$currPos" /dev/disk0s1
        currPos=$((currPos + stepSize))
        printf '%s\n' "$currPos"
    fi
    

    break이는 루프를 중단하는 데에만 사용됩니다 .

    한 줄에 이렇게 됩니다

    if [ "$currPos" -le "$finalStep" ]; then hexdump -n "$stepSize" -Cv -s "$currPos" /dev/disk0s1; currPos=$((currPos + stepSize)); printf '%s\n' "$currPos"; fi
    

관련 정보