我想创建一个 shell 脚本df
。因为,我想输入df name_of_file
然后就可以获得文件的内容。
如果文件名在目录中,我希望它显示其内容。如果没有,我想以字、行和字节为单位显示大小。我该怎么办?到目前为止,我有这个:
#!/bin/bash
FILENAME=$FILENAME
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(stat -w%s "$FILENAME")
FILELINES=$(stat -l%s "$FILENAME")
echo "Size of $FILENAME in bytes = $FILEBYTES bytes, $FILEWORDS words, $FILELINES lines."
答案1
我会这样做:
#!/bin/bash
FILENAME=$1
[ -f "$FILENAME" ] || exit
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(wc -w "$FILENAME" | awk '{print $1}')
FILELINES=$(wc -l "$FILENAME" | awk '{print $1}')
printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
"$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"
例子
假设我有这个文件:
$ ls -l | grep bbbb
-rw-rw-r-- 1 saml saml 3283 May 18 02:49 bbbb
现在我运行你的脚本,我称之为df.bash
.该df
命令已在 Unix 中使用:
$ ./df.bash bbbb
Size of bbbb -- 3283 bytes, 386 words, 94 lines.
查找不存在的文件:
$ ./df.bash bbbbbbb
$
替代方法
您可以通过合并并awk
进行计数而不是进行计数来节省一些浪费的呼叫wc
。
#!/bin/bash
FILENAME=$1
[ -f "$FILENAME" ] || exit
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(awk '{ total = total + NF }; END {print total}' "$FILENAME")
FILELINES=$(awk 'END {print NR}' "$FILENAME")
printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
"$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"
答案2
你要这个吗?
#! /bin/bash
if [[ -f $(basename "$1") ]]
then
cat "$1"
else
wc -w -l -c "$1"
fi
顺便说一句,df
已经是一个显示磁盘空间使用情况的命令。最好将您的脚本称为其他名称。