Shell必备基础(1)

Posted by 付辉 on Thursday, August 9, 2018 共993字

Shell是对Linux命令的深加工,用得好,事半功倍。 本来只想加深Array的用法,但一不小心,又变成了一篇基础大全。

比较运算

习惯在if语句中使用[[...]]对条件进行比较,字符串、数值以及文件,统统笑纳。

算数比较

常用的操作符有-eq-ne-gt-lt-le等。

文件系统

当编译文件、或者查看pid文件、日志时会经常用到。

[ -e $var ] 如果指定的变量包含的文件存在,则返回真
[ -f $var ] 如果指定的变量包含正常的文件路径或文件名,则返回真

字符串比较

判空还是相当常见的操作。比如,查看当前系统是否启用了notify的进程,如果有的话,kill掉。

pid=`ps -ef | grep notify | grep -v 'grep' | awk '{print $2}'`
if [[ -n $pid ]]
then
    echo -e "\033[31m Kill掉当前正在运行的进程... \033[0m\n"
    kill $pid
fi

常见的操作符如下:

[[ -z $str ]]   如果str包含的是空字符串,则返回真
[[ -n $str ]]   如果str包含的是非空字符串,则返回真

其他的操作符包括:==!=><

逻辑运算

使用逻辑&&||来表示与和或的逻辑关系。

比如

if [[ -n $str ]] && [[ -z $str ]]
then
    echo $str
fi

基本语句Example

if语句

if command1
then
    # ...
elif command2
then
    # ...
else
    # ...
fi

while语句

while [ 1 ] 
do
    echo $RANDOM
done

for语句

for循环总是以空格、\t\n作为分隔符。如果要明确指定分隔符的话,使用IFS明确声明。

SERVER=(
    # server list
    "node025.add.neojos.net"
    "node026.add.neojos.net"
    "node062.add.neojos.net"
    "node063.add.neojos.net"
)

#${SERVER[@]}其实就是一个用空格implode起来各个元素的组合字符串
for var in ${SERVER[@]}
do
    echo $var;
done

case语句

case $OPT in
        i)
            NEED_BUILD=false
            ;;
        b)
            BUILD_FILE=$OPTARG
            ;;
    esac

数组

定义一个数组,元素间使用空格或者\n进行分隔。

task=("delivery" "notify" "event")

要访问其中的元素,需要知道它的下标:

echo ${task[0]} ${task[1]} 

经常会用到的获取数组的方式(*可以用来替换@):

${task[@]}      #数组所有元素的value
${!task[@]}     #数组所有元素的key
${#task[@]}     #数组元素的个数

下面列举几个简单的例子:

#!/bin/bash

arr=(
	one
	two
	three
	[6]=six
)

echo "Array size :" ${#arr[@]}
# Array size : 4

函数

函数的声明:

function deploy()
{
    # 在函数体内部,通过 $n 的形式来获取参数的值
    server=$1;
    echo -e "start deploy \033[0;34m$server\033[0m; put y to continue, put n to quit:"
    read line

    if [ "$line" != "y" ]; then
        return
    fi
}

函数的调用。函数名会在$0变量中定义,函数命令行上的任何参数都需要通过$1,$2…来定义。还可以通过$#来判断参数的个数。

for server in "${SERVER[@]}"
do
    deploy $server
done

获取参数的具体形式:

$#  传递到脚本的参数个数
$*  以一个单字符串形式向脚本传递参数。如果是"$*",会输出"$1 $2 … $n"的形式。
$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。

参考文章:

  1. Bash Array