linux sh : 整理一些细节

前言

浏览了一篇讲shell编程的资料。
边看边查资料边实验,学到了一些以前不清楚或不知道的知识点。
e.g.
* linux命令帮助的本地查法 help -m , 以前用man 和info查不到,就得上网去查。这个解决能解决很多问题,上网去查出的资料,如果人家不带例子,还不如本地的帮助好。
* 在脚本中变量的正规用法 ${my_var}
* declare的几种有用的参数
* ‘’和“”的区别。以前我总是用”“.

实验

# !/bin/bash
# @file shell_basic_01.sh
# @brief 整理一些未注意到的细节

# 查看linux命令的帮助(总有一个能看到命令的帮助)
# man the_cmd
# info the_cmd # e.g. info wc
# help -m the_cmd # e.g. help -m declare

# 将一个目录中的所有文件(遍历)权限都改成一样的
# chmod -R 775 ./shell_basic/

# export的用法 e.g. export MY_PRJ_NAME="my_project"

# 查看环境变量(包括用export导出的变量)
# typeset | grep -i "the_keyword_on_OS_env"
# declare | grep -i "the_keyword_on_OS_env"

# declare的用法
# declare: usage: declare [-aAfFilrtux] [-p] [name[=value] ...]
# https://ss64.com/bash/declare.html
# help -m declare
# 觉得有用的几个declare选项
# declare -a 数组
# declare -f 函数
# declare -i 整数
# declare -r 只读

# prog info
declare -r g_str_prog_name="shell_basic_01"
declare -r g_str_prog_ver="1.0.0.1"
declare -r g_str_prog_time="2018-04-16 13:27"

# error code
declare -i MY_RC_OK=0
declare -i MY_RC_ERR=1

# sh脚本函数是没有前向声明的, declare -f fn_xx 不好使(虽然不报错)
# 为了防止调用到后面调用的函数, 将要执行的主代码放到脚本的最后面
# 这样就不会出现调用到后面定义的函数的问题

function fn_main() {
    fn_init
    fn_test_case

    echo "END"

    return ${MY_RC_OK}
}

function fn_init() {
    clear

    # 正规的使用变量的例子 e.g. ${g_str_prog_name}
    # 好处,可以防止bash分不清变量值和后面非变量字符, 等于是用{}显势指定变量名称,不用bash去猜了
    echo "[${g_str_prog_name}][${g_str_prog_ver}][${g_str_prog_time}]"

    return ${MY_RC_OK}
}

function fn_test_case() {
    declare ftype

    # wc --files0-from=F
    #   从F文件中读取文件名作为输入文件。如果F为"-",则从标准输入中读取文件名

    # 从当前目录下的.c和.h文件中取行的最大长度 e.g. 154 总用量
    find . -name '*.[ch]' -print0 | wc -L --files0-from=- | tail -n1

    # sed 用于查找替换字符串
    # awk 用来提取和打印行中的字段(分隔符可自定义)

    ftype=$(file './test.tar')

    # '', 不允许变量扩展
    # "", 允许变量扩展
    echo "ftype = [${ftype}]"
    echo -e 'ftype = [${ftype}]'
    echo 'ftype = [${ftype}]'

    printf 'printf : ftype = [${ftype}]\n'
    printf 'printf : ftype = [%s]\n' "${ftype}"

    # 在格式化字符串中,还是用''围住字符串较好
    # 如果是原样照印, 使用echo
    # 如果不是原样照印, 使用printf + '\n'
}

fn_main
exit 0

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页