我正在尝试编写一个shell脚本,以便在用户主目录(如果超过一定大小)时执行操作。不幸的是,当我尝试使用read命令拆分du -s
输出时,我得到'命令未找到',因为它试图将数字传递给shell,而不是像我想要的那样传递给变量。这是我到目前为止的脚本。
#!/bin/bash
cd /home
for i in `ls`
do
j=`du -s $i`
#this line gives me the error
k=`$j |read first;`
done
我得到如下输出:
./takehome.sh: line 6: 3284972: command not found
其中3284972是目录的大小。
答案 0 :(得分:7)
我想你会想要一些
的内容#!/bin/bash
for i in *
do
j=`du -s "$i" | cut -f 1`
echo $i size is $j
done
读入另一个变量,读取和播放这似乎是多余的。
我认为更优雅的解决方案是Jonathan Leffler的第二种方法(复制粘贴在这里)
#!/bin/bash
cd /home
du -s * |
while read size name
do
...
done
答案 1 :(得分:7)
至少有两种方法可以做到这一点:
#!/bin/bash
cd /home
for i in `ls`
do
set -- `du -s $i`
size=$1
name=$2
...
done
#!/bin/bash
cd /home
du -s * |
while read size name
do
...
done
答案 2 :(得分:2)
这是可以理解的,正如你告诉它的那样。反引号意味着:评估此字符串,将其作为命令运行并给我输出。
此外,read name
表示将数据读入变量name
。
尝试:
echo $j | read k
甚至删除上一行:
du -s $i | read k
(修改 - 正确测试,它在ksh
中工作正常但在bash
中却没有。出于某种原因。我认为它可能与子壳有关。使用如果您正在使用bash,请使用下面的反引号和cut
解决方案。)
您可以保留反对并使用cut
而不是read
:
k=`$du -s $i | cut -f1`
在这种情况下,它可能不会给你更多,但cut
比read
更强大,可能在将来的某个时候帮助你。
答案 3 :(得分:0)
如果您只想限制用户可以使用的磁盘空间量,您可能需要查看磁盘配额的概念。