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 "第一个参数与第二个参数的和:$?" # $?上次返回值