Shell基础语法

2020-03-28  本文已影响0人  tom__zhu

shell不是面向对象语言

变量

shell中赋值的变量值全部为字符串,不存在数字类型

变量分类
全局变量 ≈ 环境变量
局部变量 ≈ 本地变量

赋值方法

变量名建议大写,等号两边不能有空格形式如下

变量名=变量值

VAR=10

取变量值

推荐使用 ${变量名} 获取变量值。
如果变量没有赋值,那么 $变量名 是一个空符串,容易引起语法错误,而 ${变量名} 不会引起语法错误。

$变量名 取变量的值
${变量名} 取变量的值
$((变量名)) 对变量执行算数运算
$[变量名] 对变量执行算数运算
$(命令) 或者 `命令` 取命令执行结果

导出变量
export

删除变量
unset

查看本地变量
set

查看全局变量
env



判别符

整数判别符

只能作用于整数

$ VAR=10
$ test $VAR -eq 10
$ echo $?
0

文件类型判别符

字符串判别符

只能作用于字符串

bash-3.2$ VAR=tom
bash-3.2$ [ $VAR = tom ]
bash-3.2$ echo $?
0


条件判断

逻辑运算符

尽量使用短路特性

bash-3.2$ VAR=10; VALUE=11
bash-3.2$ [ $VAR = 10 -a $VALUE = 11 ]
bash-3.2$ echo $?
0


条件分支

/ **
  * then 相当于 "{"
  * fi 相当于"}"
  */


#! /bin/bash

echo "Hello young man? Please answer boy or girl."
read BOY_OR_GIRL
if [ "$BOY_OR_GIRL" = boy ]; then
    echo 'Hello cowboy!'
elif [ "$BOY_OR_GIRL" = girl ]; then
    echo "Hello snow queen!"
else
    echo "Sorry, $BOY_OR_GIRL not recognized. Enter yes or no."
fi
#! /bin/bash

echo "What's kind of beverage do you like: \n coca \n sprite \n tea"
read BEVERAGE

case "$BEVERAGE" in
  [cC][oO][cC][aA])
    echo "Here is your cocoa!";;
  [sS][pP][rR][iI][tT][eE])
    echo "Here is your sprite!";;
  [tT][eE][aA])
    echo "Here is your tea!";;
  *)
    echo "Sorry, $BEVERAGE is not available"
esac


循环

do 相当于 "{", done 相当于 "}"

#! /bin/bash
// 显示当前路径中所有文件信息
for file in `ls`; do
    if [ -f "$file" ]; then
        ls -l $file
    fi
done
#! /bin/bash
// 三次内输入正确密码
echo "Enter password:"
read PASWD
COUNT=1
while [ "$PASWD" != "secret" -a $COUNT -lt 3 ]; do
    echo "Sorry, try again"
    read PASWD
    COUNT=$(($COUNT+1))
done


位置参数



管道

[1] 0 标准输入 1 标准输出 2 标准出错



函数

函数没有返回值也没有参数列表

#! /bin/bash

foo() {
   for name in $@; do
       ls -l "$name"
   done
}

echo "-->start<--"
foo $@
echo "-->end<--"

函数传参

# 函数声明
foo () {
    # 函数体
}

# 函数调用以及传参
foo arg1 arg2 ...
#! /bin/bash

# 判断入参是否是文件
is_directory() {
    DIR_NAME=$1
    if [ ! -d "$DIR_NAME" ]; then
        return 1
    else
        return 0
    fi
}

# 批量创建目录
for DIR in $@; do
    if is_directory "$DIR"
        # : 表示真
        then : 
    else
        echo "$DIR not exist. Creating it now!"
        # 创建文件并将标准输出输出到”无底洞“,同时将标准错误输出到标准输出
        mkdir "$DIR" > /dev/null 2>&1
        # 判断 mkdir 命令执行结果,如果成功则输出提示语句
        if [ $? -ne 0 ]; then
            echo "Can not create directory $DIR!"
            exit 1
        fi
    fi
done


Shell脚本调试

使用方式

  1. 在命令行提供参数
sh -x ./myshell.sh
  1. shebang中指定,相当于全局设置全局调试
#! /bin/bash -x
  1. 在脚本中用 set 命令启动或禁用,方便局部设置局部调试
#! /bin/bash
if [ -z "$1" ]; then
  # 启动
  set -x
  echo "ERROR: Insufficient Args"
  exit 1
  # 取消
  set +x
fi
上一篇 下一篇

猜你喜欢

热点阅读