Bash 编程笔记

                     

贡献者: addis

  • 本文处于草稿阶段。

1. 基础

关于引号

2. pipe

3. 判断

echo 123;
if [ $? -ne 0 ]; then # 判断 exit status
...
fi

# 判断路径是否存在(感叹号后面一定要有空格)
if ! [ -d "$repo" ]; then
    echo "directory not found!" 1>&2
fi

# 判断文件是否存在且不是文件夹或者特殊文件
if ! [ -f "$fname" ]; then
    echo "file not found!" 1>&2
fi

# 判断相等
if [ $i -eq 3 ]
    ...
elif [ $i -ne 3 ]
    ...
fi

双方括号判断

   双方括号不属于 POSIX 标准而是 bash 和 zsh 等特有的。语法更为现代

4. 循环

#!/bin/bash
for ((i = 1; i < 5; ++i))
# for i in {1,2,3,4} # 等效
# for i in 1 2 3 4 # 等效
do
	printf "\nfile${i}.txt\n"
done
如果在 printf 语句后面加上 && break,当前者失败时就会跳出循环。

   另外 continue 也可以跳出循环

   在当前目录中所有子目录循环

for d in */ ; do
    d=${d%/} # 删除目录名最后的斜杠
    echo "$d" # 打印所有子目录名
done
文件循环
for file in *; do
    if [ -f "$file" ]; then
        echo "$file"
    fi
done

5. 数组

#!/bin/bash
arr=(1 3 hello 13)
for ((i=0;i<4;++i))
do
    printf "arr[${i}] = ${arr[i]}\n"
done

6. 输入

   例子

#!/bin/bash
# 确保文件最后有两个空格
# use `find . -type f -name "*.matt" -exec ./convert_matt.sh {} \;`
# to convert subfolder
file=${1}
printf "${file}... "
c2=$(tail -c 2 ${file})
if [ "${c2}" == "  " ]
then
	printf "already in new format\n"
else
	printf "  " >> ${file}
	printf "done\n"
fi

7. 特殊变量

8. 函数

   $0 是调用脚本的命令(也就是 argv[0])。$# 可以查看 args 的总个数

   一个用于确保执行成功的函数:

check_failure() {
    if [ $1 -ne 0 ]; then
        echo "Error! Exiting..."
        exit 1
    fi
}

cmd1 arg1 && cmd2 arg2
check_failure $?

9. 获取系统信息

                     

© 小时科技 保留一切权利