androidapachebackendcentoscentos8.4commandcomposercrontabcurldesigndevelopdockerelasticfinancingfirewallfrontendgatewaygitgolanghybridiisiptablesjavajenkinskuberneteslaravelluamacmemcachemigrationmongodbmysqlnginxnodejsofficeopenrestyopensslperformancephpproductionredisregexprestfulsecurityshellsnippetsshstartupteamtraintravelunitvmwarevsftpwindowsworkwwwyaf

Shell

代码片段

当前Shell位置

basepath=$(cd `dirname $0`; pwd)

获得 GIT hooks 环境变量

#!/bin/bash
echo Running $BASH_SOURCE
set | egrep GIT
echo PWD is $PWD

条件判断

整数比较

= 比较两个字符串
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

逻辑的(and)与(or)

&& 逻辑的 AND 的意思,别名 -a 
|| 逻辑的 OR 的意思,别名 -o

文件权限比较

-r 有读的权限
-w 有写的权限
-x 有执行的权限

文件比较符

-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新  [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧  [ "/data/file1" -ot "/data/file2" ]

IF 判断

文件夹不存在则创建

if [ ! -d "/data/" ];then
    mkdir /data
else
    echo "exist"
fi

判断文件是否存在

if [ ! -f "/data/filename" ];then
    touch /data/filename
elif [ ! -w "/data/filename" ] then
    echo "Non-Writable"
else
    echo "exist"
fi

CASE 语句

case $1 in
"1")
    echo "周一";;
"2")
    echo "周二";;
*)
    echo "others";;
esac

# ./test.sh 1

for 循环

# 使用 $*
for i in "$*"
  do
    echo "the nums are $i"
done

echo "====================="

# 使用 $@

INDEX=0

for j in "$@"
  do
    INDEX=$[$INDEX + 1]
    echo "the num of $INDEX is $j"
done

# ./test.sh 11 22 33

while 循环

SUM=0
idx=0

while [ $i -le $1 ]
do
    SUM=$[$SUM+$i]
    idx=$[$idx + 1]
done

echo "从1加到$1的总和为:$SUM"

# ./test.sh 49

read 读取控制台输入

语法

read(选项)(参数)
    选项:-p 指定读取时的提示符;
        -t 指定读取时等待的时间(秒),如果没有在指定的时间内输入,就不在等待;
    参数: 变量,指定读取的变量名,将读取到的内容赋值给变量;

例子

read -t 5 -p "请输入一个数字num:" NUM1
echo "您输入的数字为:$NUM1"

# ./read.sh

自定义函数

function getSumFromInput(){
    SUM=$[$n1 + $n2]
    echo "输入参数的和为:$SUM"
}

read -p "请输入一个数值:" n1
read -p "请输入一个数值:" n2

getSumFromInput $n1 $n2

# ./func.sh

常见错误

$'\r': command not found

文件换行符必需是 Unix (LF)

CentOS 7.3 环境中,LF 换行符的 Shell 可能会出错,需要转换为

Mac (CR)

相关链接