将 if...then 语句的命令分组,包括在单行中为 shell/bash 分配变量

将 if...then 语句的命令分组,包括在单行中为 shell/bash 分配变量

我知道的存在完成时。或者,我知道我可以使用待办事项完成。但是,我试图使用手动测试如果-那么-否则

我想执行一个命令,但在每次迭代中进行加法转换。

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变量正在改变(163248)!

编辑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/ 一些:ifthenelsefi( -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 工具会重新排列给定的参数,以便实现这种情况(以便用户不必考虑它),但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不会在命令调用之间更新,(...)因为您在显式子 shell 中(即括号内)更新它。无法从子 shell 内更改父环境,并且子 shell 环境在终止时将被丢弃。

  • 使用时{ ...; },后面需要有一个空格{。是{一个引入“复合命令”的关键字,即由多个其他命令组成的命令。

    您通常会在 Shell 语法需要单个命令(例如管道的单个阶段)的情况下使用这样的复合命令,或者将多个命令的输出与单个重定向一起重定向。

    { ...; }在语句中使用 是不必要的,因为语句中的和(或)if之间可能有任意数量的单独命令: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
    

相关内容