在下面的“单线”中,当我ID
在脚本开头更改变量值时,后面的disk
变量似乎没有更新。即,在脚本结束时,该>> /md0/DiskAnalysis/$disk.txt
部分使用由与脚本开头定义的变量值$disk
不同的变量值生成的变量值。$ID
完整的单行脚本
nohup sh -c ID="c"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; size=`lsblk -b --output SIZE -n -d /dev/sd$ID`; size=`echo "$size / 1024 / 1024 / 10" | bc`; for i in $(seq 0 $size); do dd if=/dev/sd$ID of=/dev/shm/$ID.dd bs=10M skip=$i count=1 2>1; sha256=`sha256sum /dev/shm/$ID.dd | awk -F' ' '{print $1}'`; md5=`md5sum /dev/shm/$ID.dd | awk -F' ' '{print $1}'`; echo "$i,$sha256,$md5" >> /md0/DiskAnalysis/$disk.txt; done &
所以,当我更改ID="b"
为时ID="c"
,
disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`
脚本的一部分不会更新其值以反映$ID
变量值的变化。但是,如果我要在终端中自行执行以下操作:
ID="b"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; echo $disk
和
ID="c"; disk=`udevadm info --query=all /dev/sd$ID | grep ID_SCSI_SERIAL | awk -F'=' '{print $2}'`; echo $disk
我得到两个不同的值$disk
。
我缺少什么导致$disk
变量值未在完整脚本中更新?
目前,我假设$ID
脚本其他部分(即校验和)中值的变化工作正常。但是,由于该$disk
值未正确更新,因此输出未写入所需的文件。事实上,每次我使用与原始值$ID
不同的值ID="b"
($disk
$ID
谢谢。
那里有一个未引用的,未转义的
;
。nohup sh -c ID="c"; whatever
先运行nohup sh -c ID="c"
,然后whatever
.第一个命令几乎是空操作。它不会影响当前 shell 的变量,在当前 shell
whatever
中解释时不会影响扩展,也不会影响whatever
您想要的方式。它只创建nohup.out
(如果尚未创建)。基本上你需要
nohup sh -c 'ID="c"; whatever'
(&
如果需要添加)。;
当前 shell 不解释此处。整个单引号字符串最终将成为传递给的选项参数sh -c
。我还没有彻底分析你的具体命令来告诉你:
sh -c
在sh
.一般来说,这些是不同的问题。
在您所写的“脚本”中,
sh -c
仅适用于ID="c"
,即不适用于分号右侧的所有内容。这意味着ID="c"
在执行下一个命令之前清理的子进程中设置。要看到这一点,只需执行sh -c somevar="x"; echo $somevar
.对于要共享的变量,它要么需要被导出(参见bash 中“a=b”和“export a=b”之间的区别),要么具有相同的父进程。
例如,
somevar="x"; echo $somevar
(没有在子进程中设置变量)可以工作;orsh -c 'somevar="x"; echo $somevar'
也可以,因为这两个命令都是sh -c
.