我在工作中遇到了很多麻烦,试图将一长串回显输出保存为桌面上的 .txt 文件。我在 Yosemite 10.10.4 中使用 Bash。我对 Bash 还很陌生,因此非常感谢任何帮助和提示。
目标是打印每次脑部扫描所使用的协议名称,以获得一长串脑部扫描列表。我使用 for 循环递归地遍历每次大脑扫描,提取所使用的协议,然后回显它以及用于获取该信息的确切文件的路径。
我的脚本:
for i in /Path/to/scans/
do
for file in "$i/"001*/0001.dcm
do
# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]
then
echo "Skipping $i, no 0001.dcm file here" >&2
continue
fi
# Otherwise take the protocol data from scan out
line= dcmdump +P 0040,0254 0001.dcm
## dcmdump is the command line tool needed to pull out this data.
## In my case I am saving to variable "line" the protocol used in
## the scan that this single 0001.dcm file belongs to (scans require
## many .dcm files but each one contains this kind of meta-data).
# Print the result
echo "$line $file"
break
done
done
所以这个脚本几乎可以工作。在我的终端窗口中,我确实得到了所使用的协议的长列表,以及每次扫描所使用的 0001.dcm 文件的绝对文件路径。
我的问题是,当我将其更改为
echo "$line $file" >> /Users/me/Desktop/scanparametersoutput.txt
我的桌面上显示的文本文件是空白的。有人知道我做错了什么吗?
答案1
您的脚本遇到的一个问题是这一行:
line= dcmdump +P 0040,0254 0001.dcm
dcmdump
它不会将的输出分配给,而是使用名为set to 的环境变量来line
运行命令。您可以阅读有关此内容的更多信息dcmdump
line
''
这里。
dcmdump
因此,您实际看到的是脚本运行的输出,而不是 的输出$line
,因为$line
没有分配任何内容。
要捕获程序的输出,请使用以下语法
line=$(dcmdump +P 0040,0254 0001.dcm)
=
(另请注意,为了安全起见,标志前后没有空格。)
$()
在子 shell 中运行括号内的代码,然后用该代码的输出“替换”自身。
您可能也希望0001.dcm
在dcmdump
命令中使用$file
它,但我对此并不熟悉,所以我将其留给您。
答案2
正如 rmelcer 提到的,该line
变量没有被设置,看起来dcmdump
没有在正确的文件上运行:
line=$(dcmdump +P 0040,0254 "$file")
脚本的设置和结构看起来比实际需要的要复杂一些。
外path
循环不循环,但这可能只是为了你的例子?
您的文件测试不太可能失败,除非您有名为 0001.dcm 的目录(正如您在循环0001.dcm
中专门查找的那样for
)。
for path in /Path/to/scans/; do
for file in "$path/"001*/0001.dcm; do
# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]; then
echo "Skipping $file, no 0001.dcm file here" >&2
continue
fi
# Otherwise take the protocol data from scan out
line=$(dcmdump +P 0040,0254 "$file")
# Print the result
echo "$line $file"
done
done
如果您可以处理输出中首先出现的文件名,则使用以下命令可能会更简单find
:
find /Path/to/scans/001* \
-name 0001.dcm \
-type f \
-printf "%p " -exec dcmdump +P 0040,0254 {} + \
| tee /Users/me/Desktop/scanparametersoutput.txt
这会查找名为 0001.dcm ( )/Path/to/scans/001*
的文件 ( ),打印出该文件 ( ) 的完整路径,并对文件 ( ) 运行 dcmdump 命令。-type f
-name 0001.dcm
-printf "%p "
-exec xxx {} +
find 命令的输出然后通过管道传输到tee
屏幕上并打印到指定的文件 ( /Users/me/Desktop/scanparametersoutput.txt
)