shell script

常用命令

shift

删除参数

一个run.sh脚本:

#!/bin/bash
while [ $# != 0 ];do
echo "第一个参数为:$1,参数个数为:$#"
shift
done

执行run.sh a b c d e f 结果是

第一个参数为:a,参数个数为:6
第一个参数为:b,参数个数为:5
第一个参数为:c,参数个数为:4
第一个参数为:d,参数个数为:3
第一个参数为:e,参数个数为:2
第一个参数为:f,参数个数为:1

从上可知shift(shift 1)命令每执行一次, 变量的个数$#减一(之前的$1变量被销毁, 之后的$2就变成了$1), 而变量值提前一位.

local

定义局部变量, 默认是 global 变量, 加上 local 就是局部变量, 可以在函数里定义 local

function main() {
  local a="hello world"
  echo $a
}

main     # 结果是hello world
echo $a  # 这里打印不出来, 如果去掉local就可以打印出来

echo

echo 除了打印, 还能代表返回值:

function main() {
  local a="hello world"
  echo $a
  return 0
}

b=$(main)
echo $b # 这里输出是hello world, 而不是0

define a function

function main() {
  echo "hello world"
}

main

运算符

关系运算符

  • -lt 是否小于

文件测试运算符

  • -f file 检测文件是否是普通文件(既不是目录,也不是设备文件), 如果是, 则返回 true.
    if [ -f $file ]
    then
     echo "文件为普通文件"
    else
     echo "文件为特殊文件"
    fi
    

字符串运算符

  • -z 检查字符串长度是否为 0, 为 0 则返回为 true

    if [ -z $a ]
    then
     echo "-z $a : 字符串长度为 0"
    else
     echo "-z $a : 字符串长度不为 0"
    fi
    
  • -z 检查字符串长度是否不为 0, 不为 0 则返回为 true

语法

if else

if [ a == b ]; then
  echo "a == b"
fi

或者不要分号, 把then换行

if [ a == b ]
then
  echo "a == b"
fi

获取命令的输出

out=$([command])

定义 dict 然后 loop


declare -A maps=(
    ["Antingxinzhen"]="antingxinzhen_v1"
    ["Hefei"]="hefei_v1"
    ["Huanbaoyuan"]="huanbaoyuan_v13"
    ["Shenzhen"]="shenzhen_v1"
)
for map in "${!maps[@]}";
do
    grep "$map" $2
    if [ $? == 0 ]; then
        declare new_map_dir="${maps[$map]}"
        echo $new_map_dir
        echo $MAPDIR_NAME
        if [[ $new_map_dir != $MAPDIR_NAME ]]; then
            echo "map dir name is $MAPDIR_NAME, change it to $new_map_dir"
            /home/apollo/apollo/scripts/dv_run.sh stop $1
            sleep 5
            export MAPDIR_NAME=$new_map_dir
        fi
        break
    fi
done
echo $MAPDIR_NAME

variables

$BASH_SOURCE

$BASH_SOURCE is bash file’s directory:

cd `dirname ${BASH_SOURCE}` && pwd

this code can cd to bash file’s directory and output directory path.

define variable from env and default value

we can define a variable from env, if env value is not exist, we can use default value.

my_var=${ENV_VALUE:-default_value}

if not ENV_VALUE, then my_var is default_value

if we want sign a value to ENV_VALUE, we can use:

: ${ENV_VALUE:=default_value}

colon is a command, it do nothing. if we not use colon punctuation, th command after it will error: command not found.

handle string

remove suffix

file name is “abc.txt”, we want to remove “.txt”, we can use:

file_name="abc.txt"
echo ${file_name%.txt}