文先生的博客 求职,坐标深圳。(wenfh2020@126.com)

[shell] shell 常用语法

2019-02-20

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

5. 参考


作者公众号
微信公众号,干货持续更新~