我正在尝试将.nii文件(Gabor3.nii)路径复制到变量,但即使find
命令找到该文件,我也无法将路径复制到该变量。
find . -type f -name "*.nii"
Data= '/$PWD/"*.nii"'
输出:
./Gabor3.nii
./hello.sh: line 21: /$PWD/"*.nii": No such file or directory
答案 0 :(得分:2)
您可以使用命令替换:
Data=$(find . -type f -name "*.nii" -print -quit)
为了防止多行输出,-quit
选项在找到第一个文件后停止搜索(除非您确定只找到一个文件或者您想要处理多个文件)。
答案 1 :(得分:2)
您表明您正在使用:
Data= '/$PWD/"*.nii"'
空格意味着Data=
部分将环境变量$Data
设置为空字符串,然后尝试运行'/$PWD/"*.nii"'
。单引号表示它们之间的内容未展开,并且您没有目录/$PWD
(目录名称为$
,P
,{ {1}},根目录中的W
,因此找不到脚本D
,因此出现错误消息。
行;那是什么错。什么是对的?
你有几个选择。最可靠的是使用数组赋值和shell扩展:
"*.nii"
括号(注意Data=( "$PWD"/*.nii )
之前没有空格 - 这是至关重要的)使它成为一个数组赋值。使用shell globbing可以正确地给出名称列表,保留名称中的空格等。在(
周围使用双引号可确保扩展正确,即使当前目录名中有空格也是如此。
您可以在列表中找到有多少文件:
"$PWD"
您可以使用以下内容迭代文件名列表:
echo "${#Data[@]}"
请注意,对于包含空格的名称,变量引用必须是双引号才能正常工作。 for file in "${Data[@]}"
do
echo "File is [$file]"
ls -l "$file"
done
表示法与"${Data[@]}"
相似,它还保留命令参数中的空格。有一个"$@"
变种,其行为与"${Data[*]}"
类似,价值也相似。
如果您担心可能没有任何带扩展名的文件,请使用"$*"
将globbing表达式扩展为空列表,而不是未扩展的表达式,这是历史默认值。如有必要,您可以使用shopt -s nullglob
取消设置选项。
替代方法涉及使用命令替换shopt -u nullglob
之类的事情,但这远远不如使用数组,除非Data=$(ls "$PWD"/*.nii)
中的路径和文件名都不包含任何空格,制表符,换行符。如果名称中没有空格,则可以正常工作;你可以迭代:
$PWD
但是,如果周围有(或可能是)任何空白字符,则完全不太令人满意。
答案 2 :(得分:1)
执行您似乎尝试执行的操作的语法:
Data= '/$PWD/"*.nii"'
将是:
Data="$(ls "$PWD"/*.nii)"
不是说这是最好的方法,无论你想做什么,当然,它可能不是......