Shell 编程基础语法

# shell脚本
# 如何运行shell脚本
    sh test.sh    
    source test.sh
    ./test.sh    # 需要有执行权限
# source和其他两种的区别是。source不会开新进程去执行脚本。
# 所以如果在主进程中定义的变量脚本中要用的话,就需要用export关键字去定义变量。
# export定义的变量,子进程可以访问。

# 首行必须是"#! /bin/bash"  意思是你写的脚本将用哪个解释器去执行它

# 变量
name="zhang san"     # 定义字符串变量。
name1=zhangsan       # 这也是,没有单引号或者双引号中间不允许有空格
name2='zhang san'    # 这也是
name3="test $name"   # 双引号会自动将变量值替换,而单引号不会替换
echo $name           # 输出变量
echo ${name1}        # 也是输出变量
readonly name        # 将变量设置为只读。也就是后面不允许对该变量再次赋值
unset name1          # 删除变量。只读变脸不可删除
echo ${#name}        # 获取变量长度
# 数组
names=("a" "b" "c")  # 定义数组
echo ${names[0]}     # 访问数组元素
echo ${names[@]}     # 输出数组所有元素
echo ${#names[@]}    # 获取数组长度
# 注释:"#"号开头单行注释

# shell 传参数
echo "执行shell脚本的文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
# "$#":传递参数的个数     
# "$*":以一个单字符串显示所有向脚本传递的参数  
# "$$":脚本运行的当前进程id号
# "$!":后台运行的最后一个进程的ID号
# "$?" 显示最后命令的退出状态。0标识没有错误,其他标识有错误

# 关系运算符
# 等号:  -eq
# 不等号: -ne
# 大于: -gt
# 小于: -lt
# 大于等于: -ge
# 小于等于: -le
a=10
b=20
if [ $a -eq $b ]
then
        echo "$a -eq $b : a 等于 b"
else
        echo "$a -eq $b : a 不等于 b"
fi

# 布尔运算符
# !=   ==  
if [ $a == $b ]
then
        echo "$a -eq $b : a 等于 b"
else
        echo "$a -eq $b : a 不等于 b"
fi
# 逻辑运算 
# &&   ||
if [[ $a -lt 100 && $b -gt 100 ]]
then
        echo "返回:True"
else
        echo "返回:False"
fi

# 字符串运算符
# =    !=    -z(字符串长度为0)   -n (字符串长度不为0)  
a='abc'
b='abc'
if [ $a = $b ]
then
        echo "相等"
else
        echo "不相等"
fi

if [ $a ]
then
        echo "不为空"
else
        echo "为空"
fi

if [ -n $a ]
then
        echo "长度不为0"
else
        echo "长度为0"
fi

# 文件测试运算符
# -r(是否可读,文件不存在的时候返回False)  -w(是否可写)  -x(是否可执行)  -f(是否为普通文件)  -d(是否为目录)  -s(文件不为空,返回True)  -e(文件是否存在)
file="/home/pc1/odoo-conf/test1.sh"
if [ -r $file ]
then
        echo "文件可读"
else
        echo "文件不可读"
fi

# "``"
echo `pwd`  # 这里并不会直接显示pwd,而是将pwd当做命令执行,然后返回结果显示
echo -e "\nhello\" \c"  # "\"转义  \n换行   \c不换行  -e不换行

# test   与正常比,少了个中括号
if test ${a} -eq ${b} 
then
        echo "$a -eq $b : a 等于 b"
else
        echo "$a -eq $b : a 不等于 b"
fi

# if语句
if test ${a} -eq ${b} 
then
        echo "$a -eq $b : a 等于 b"
elif ${a} -ne ${b} 
        echo "$a -eq $b : a 不等于 b"
        
fi

# case分支
echo '输入1到4之间的数字:'
echo '你输入的数字为:'
read num
case $num in
        1) echo '你选择了 1'
        ;;
        2) echo '你选择了 2'
        ;;
        3) echo '你选择了 3'
        ;;
        4) echo '你选择了 4'
        ;;
        *) echo "你选择了 * $num"
        ;;
esac

# for循环分支
names=(1 2 3 4 5)
for loop in ${names[@]}
do
        echo $loop
done

# while循环
while :
do
        echo -n "输入1到5的数字,6退出:"
        read anum
        case $anum in
                1|2|3|4|5) echo "你输入的为: $anum"
                ;;
                6) echo "退出"
                        break
                ;;
                *) echo "输入错误!"
                        continue
                ;;
        esac
done

# 字符串不为空
a=''
if [ ! $a ] 
then
    echo "字符串为空的时候执行这里"
fi

# 多条件判断 ||  &&
echo "是否确认本次操作(Y/N)?:"
read ch
if [ $ch == "Y" ] || [ $ch == 'y' ]
then
    echo "你选择了确认"
fi

# 函数
funwithParam(){
  echo "第一个参数 $1"
  echo "第二个参数 $2"
  echo "第三个参数 $3"
  echo "第四个参数 $4"
  echo "第五个参数 $5"
  echo "第六个参数 $6"
  return $(($1+$2))
}
funwithParam 1 2 3 4 5 6          # 调用函数
echo "第一个参数与第二个参数的和:$?"    # $?上次返回值

 

posted @ 2022-01-27 13:29  看一百次夜空里的深蓝  阅读(112)  评论(0编辑  收藏  举报