Shell 编程基础语法
阅读原文时间:2023年07月08日阅读:2

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