![将 if...then 语句的命令分组,包括在单行中为 shell/bash 分配变量](https://linux22.com/image/209505/%E5%B0%86%20if...then%20%E8%AF%AD%E5%8F%A5%E7%9A%84%E5%91%BD%E4%BB%A4%E5%88%86%E7%BB%84%EF%BC%8C%E5%8C%85%E6%8B%AC%E5%9C%A8%E5%8D%95%E8%A1%8C%E4%B8%AD%E4%B8%BA%20shell%2Fbash%20%E5%88%86%E9%85%8D%E5%8F%98%E9%87%8F.png)
我知道的存在完成时。或者,我知道我可以使用待办事项完成。但是,我试图使用手动测试如果-那么-否则。
我想执行一个命令,但在每次迭代中进行加法转换。
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
不会在命令调用之间更新,(...)
因为您在显式子 shell 中(即括号内)更新它。无法从子 shell 内更改父环境,并且子 shell 环境在终止时将被丢弃。使用时
{ ...; }
,后面需要有一个空格{
。是{
一个引入“复合命令”的关键字,即由多个其他命令组成的命令。您通常会在 Shell 语法需要单个命令(例如管道的单个阶段)的情况下使用这样的复合命令,或者将多个命令的输出与单个重定向一起重定向。
{ ...; }
在语句中使用 是不必要的,因为语句中的和(或)if
之间可能有任意数量的单独命令: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