这里写自定义目录标题
1. Shell 文件和文件夹的例子
1.1. 文件
1.1.1. 清空文件
cat /dev/null > aaa
1.1.2. 判断文件是否为空
1.1.3. 编辑文件
1.1.3.1. Linux 向文件末尾追加命令
// echo 后边用单引号包围要添加的内容
echo 'add content'>>/home/data/test.sh
注意: >>
是追加。
echo 'add content'>/home/data/test.sh
注意: >
是删除原有内容, 添加。
1.1.4. 获取当前文件夹下文件数
#!/bin/sh
count=`ls $*|wc -w`
echo $count
#if [ "$count" > "0" ];
#then
## echo "file size $count"
#else
## echo "empty!"
#fi
1.1.5. 统计文件夹下文件的个数
ls -l | grep "^-" | wc -l
1.1.6. 统计文件夹下文件个数, 包括子文件
ls -lR | grep "^-"| wc -l
1.2. 文件夹
1.2.1. 判断文件夹是否为空
#!/bin/sh
DIRECTORY=$1
if ["`ls -A $DIRECTORY`" = ""]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
1.2.2. 判断目录是否存在
#!/bin/sh
dir="test"
if [ ! -d $dir ]; then
echo "$dir not exists"
mkdir "$dir"
else
echo "$dir exists!"
fi
1.2.3. 统计文件夹下目录个数
ls -l | grep "^d" | wc -l
1.2.4. 统计文件夹下目录个数, 包括子目录
ls -lR | grep "^d"| wc -l
2. Shell 流程控制
2.1. 退出脚本
2.1.1. 退出当前 Shell 脚本
#!/bin/sh
exit 1
2.1.2. 退出整个脚本
当使用管道时, 上述做法 exit 只能退出它所在的 Shell, 而放在管道中执行的命令 / 函数都是在独立的 Shell(Sub-Shell) 中执行的, 不会退出整个脚本, 正确的做法应该是使用 trap 和 kill 退出整个脚本:
#!/bin/bash
export TOP_PID=$$
trap 'exit 1' TERM
exit_script(){
kill -s TERM $TOP_PID
}
echo "before exit"
:|exit_script
echo "after exit"
EOF
chmod a+x test.sh
./test.sh
echo $?
## 输出
before exit
1
这里首先在脚本的主进程中捕获(trap) TERM 信号: 当主进程接收到 TERM 信号后, 会执行 exit 1; 再在 Sub-Shell 中向脚本主进程发送 TERM 信号, 这样就可以让整个脚本退出了!
3. 判断一个命令是否存在
首先要说明的是, 不要使用 which
来进行判断, 理由如下:
which
非 SHELL 的内置命令, 用起来比内置命令的开销大, 并且非内置命令会依赖平台的实现, 不同平台的实现可能不同。
# type type
type is a shell builtin
# type command
command is a shell builtin
# type which
which is hashed (/usr/bin/which)
- 很多系统的
which
并不设置退出时的返回值, 即使要查找的命令不存在,which
也返回0
# which ls
/usr/bin/ls
# echo $?
0
# which aaa
no aaa in /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/local/bin /usr/local/sbin /usr/ccs/bin /usr/openwin/bin /usr/dt/bin
# echo $?
0
- 许多系统的
which
实现, 都偷偷摸摸干了一些 “不足为外人道也” 的事情
所以, 不要用 which
, 可以使用下面的方法:
$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ type foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ hash foo 2>/dev/null || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
犀利的原文, 可以在这里查看:
http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script/677212#677212