내가 아는 존재완전한. 또는 다음을 사용할 수 있다는 것을 알고 있습니다.할 일 완료. 그러나 다음을 사용하여 수동으로 테스트하려고했습니다.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
, 32
및 48
)!
편집 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
, else
및 fi
( -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
: 명령문의 명령(, 및)을 그룹화합니다 (
.)
hexdump
assignation
echo
then
if
그러나 이 경우 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 도구는 이를 허용하도록 주어진 인수를 재배열하지만(사용자가 그것에 대해 생각할 필요가 없도록), hexdump
GNU가 아닌 시스템에서는 이 작업을 수행하는 도구 중 하나가 아닙니다.
따라서 설명서에 설명된 대로 이러한 도구를 사용하십시오. 이는 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) 사이에 별도의 명령이 얼마든지 있을 수 있으므로 명령문 내에서 사용할 필요는 없습니다 .then
else
fi
if
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