shell 常用语法,整理方便查阅。
1. 语法
1.1. for
- 遍历目录。
1
2
3
for p in $paths;
do
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
work_path=$(dirname $0)
cd $work_path
work_path=$(pwd)
subdirs=$(ls $work_path)
protoc --version >/dev/null 2>&1
[ $? -ne 0 ] && echo 'pls install protobufs.' && exit 1
for dir in $subdirs; do
if [ -d $work_path/$dir ]; then
cd $work_path/$dir
protoc -I. --cpp_out=. *.proto
fi
done
- 循环。
1
2
3
for ((i = 1; i <= $test_cnt; i++)); do
...
done
1.2. if
1
2
3
4
5
6
7
8
# 判断目录是否存在
if [ ! -d "$dir" ]; then
else
fi
# 判断字符串是否相等
[ "a" != "b" ] && command
[ $1 == "kill" ] && command
1.3. 数组
1
2
3
4
5
array=(1000 3000 5000 8000 10000 15000 20000 25000)
for x in ${array[*]}; do
...
done
1.4. 文件
参数 | 描述 |
---|---|
-d | 文件夹是否存在 |
-x | 文件是否有执行权限 |
-f | 文件是否存在 |
1.5. 数值比较
参数 | 描述 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
1.6. 字符串
参数 | 描述 |
---|---|
== | 等于 |
!= | 不等于 |
-z | 字符串的长度为0 |
-n | 字符串的长度不为0 |
1.7. 特殊字符
参数 | 描述 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 显示所有向脚本传递的参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号 git commit -m “$(echo “$@”)” |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
1.8. 函数
1
2
3
4
5
function main() {
# do something.
}
main $@
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function func_check_path() {
if [ ! -d "${ROOT_PATH}" ]; then
echo "invalid root path."${ROOT_PATH}
return 1
elif [ ! -d "${TOOLS_PATH}" ]; then
echo "invalid tools path."${TOOLS_PATH}
return 2
elif [ ! -d "${PROTO_PATH}" ]; then
echo "invalid proto path."${PROTO_PATH}
return 3
fi
return 0
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function check_process() {
[ -z "$1" ] && return 1
pro_num=$(ps -ef | grep -w "$1" | grep -v "grep" | wc -l)
[ $pro_num -eq 0 ] && return 0 || return 1
}
function kill_process() {
[ -z "$1" ] && return 1
pro_name=$1
pids=$(pgrep -f "$pro_name")
for pid in $pids; do
kill $pid
done
}
1.9. 注释
单行 ‘#’,多行:
1
2
3
4
5
#: '
echo ${WORK_PATH}
echo ${TOOLS_PATH}
echo ${PROTO_PATH}
#'
2. 读文件
1
2
3
4
while c1 c2 c3
do
# do something.
done < ${file}
3. 算术
1
2
3
SUCCESS=0
let SUCCESS++
echo $SUCCESS
4. 时间
1
2
3
4
5
6
7
BUILD_BEGIN_TIME=`date +"%Y-%m-%d %H:%M:%S"`
local begin_time=${BUILD_BEGIN_TIME}
local end_time=`date +"%Y-%m-%d %H:%M:%S"`
begin_time_data=`date -d "$begin_time" +%s`
end_time_data=`date -d "$end_time" +%s`
interval=`expr $end_time_data - $begin_time_data`
1
2
end_time=`date +"%Y-%m-%d %H:%M:%S"`
printf "%-10s %-11s" "end:" $end_time