我对 shell 脚本和为项目编写脚本非常陌生。我在对文件名执行“stat”以检查大小时遇到问题,文件名中有空格。问题是我无法直接编写命令,首先我必须将其存储在变量中,然后我必须通过该变量执行它。例如,我的脚本是:
##test.sh
###Start
OIFS=$IFS
IFS=$'\n'
filename=$1
a=stat
b=-c
c=%s
d=${filename}
CMD="$a $b $c $d"
result=`$CMD`
echo "Size is:"$result
IFS=$OIFS
###END
我已设置 IFS=$'\n' 来将其中包含空格的文件名作为参数传递。当我执行它时,我得到:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
./test.sh: line 9: stat -c %s dirLevel1/file Level1.txt: No such file or directory
Size is:
由于 IFS,我认为 shell 将命令视为一个单元,而不会将其拆分成多个部分,如果我删除 IFS 的设置,那么它会说:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
stat: cannot stat `dirLevel1/file': No such file or directory
stat: cannot stat `Level1.txt': No such file or directory
Size is:
因此它将参数视为两个不同的文件。我不能使用“$@”,因为我从其他列出目录中文件的逻辑中获取文件名,例如
for i in 'find ${arg} -type f'
do
calling the test.sh
done
请尽快帮助我..!!提前谢谢....!!
答案1
BASH 常见问题解答#50:“我试图将命令放入变量中,但复杂的情况总是失败!”
答案2
我同意 Ignacio 的观点,保持 Bash 脚本简单是最好的方法。从那以后,我简化了脚本以允许它处理空格。为了允许它处理空格,将文件名括在引号中允许脚本处理文件名中的空格。
##test.sh
###Start
result=`stat -c %s "$1"`
echo "Size is:"$result
###END
答案3
我意识到这是一个老话题,但我找到了一篇很好的文章,它解决了将文件名输入 stat 时出现的问题。也就是说,您需要将 xargs 与 -d 标志(用于分隔符)一起使用,以指定除空格之外的其他分隔符。当我将分隔符指定为换行符 '\n' 时,它对我有用!