Linux的shell编程可以理解为Windows里面的powershell和cmd
新建文件与执行
在root文件夹新建shell文件后写入命令
cd /root
vi test.sh # shell文件后缀为.sh
添加执行权限后运行该文件
chmod +x test.sh
# 三种方法都可以运行
bash test.sh
./test.sh
/root/test.sh
shell文件标准开头:
#!/bin/bash
运行输出ifconfig结果后输出haha
#!/bin/bash
ifconfig
echo 'haha'
此时haha不会输出
#!/bin/bash
ifconfig
exit 1
echo 'haha'
如果结束时候写
exit 1
,那么这个.sh文件执行完之后,echo $?
就会输出1,数字最高到255,其他的都输出0
使用/修改变量
#!/bin/bash
$your_name="xiaoming"
echo $your_name
$your_name="xiaohong"
echo ${your_name} # 都可以输出变量
Linux中变量赋值操作会把空格当作命令执行
设置只读变量
$your_name="xiaoming"
readonly your_name
$your_name="xiaohong"
执行会报错,原变量未被修改
删除变量
$your_name="xiaoming"
unset your_name
echo $your_name
不存在变量输出为空
参数
$1 $2 $3 # 对应调用第1、2、3个参数
$0 # 命令本身
$* # 传递给脚本的所有参数(把所有参数当作整体)
$@ # 传递给脚本的所有参数
$# # 传递给脚本参数的个数
$*和$@虽然结果一样,但是前者是一个整体,整个是一个字符串
条件和运算符
#!/bin/bash
num1=100
num2=200
if test $[num1] -eq $[num2]
then
echo 'dengyu'
else
echo 'budengyu'
fi
数值测试:
-gt >
-ge >=
-eq =
-ne !=
-lt <
-le <=
参数交互
运行后输入参数
#!/bin/bash
read -p 'shu ru num1&num2:' num1 num2
if [ $num1 -gt $num2 ];then
echo 'num1>num2'
elif [ $num1 -lt $num2 ];then
echo 'num1<num2'
else
echo 'num1=num2'
fi
运行前带入参数
#!/bin/bash
if [ $1 -gt $2 ];then
echo 'dayu'
elif [ $1 -lt $2 ];then
echo 'xiaoyu'
else
echo 'dengyu'
fi
用户传入的参数在
[]
前后要有空格
用户创建
#!/bin/bash
if [ $# -lt 1 ];then # 必须带参数
echo '必须一个以上参数'
exit 1 # $?=1
fi
if id $1 &>/dev/null;then # &>将输出重定向到回收站
echo '$1 exist'
exit 0
else
useradd $1
[ $? -eq 0 ] && echo "$1" | passwd --stdin $1 &>/dev/null # 如果用户输入正确,将用户的键盘输入(用户名)当作密码保存并不输出
fi
命令:./test.sh xiaoming
,如果xiaoming不存在,就会创建一个用户名和密码都是xiaoming的账户
命令执行正确$?=0,执行失败$?=1
函数
直接调用
#!/bin/bash
function fun1(){
echo 'haha'
}
fun1 # 调用函数
有返回值(计算后直接输出)
#!/bin/bash
function fun1(){
echo 'input num1:'
read num1
echo 'input num2:'
read num2
res=$[$num1+$num2]
echo $res
}
fun1
有返回值(计算后通过其他函数输出)
#!/bin/bash
function sum(){
b=0
b=$[$1+$2]
return $b
}
read -p "Please input num1:" num1;
read -p "Please input num2:" num2;
function sum1(){
sum $num1 $num2
a=$?
echo $a
}
sum1
return只能返回0-255之间的整数,超过255重新计数;return出来的只能使用
$?
才能看到,输出最好还是用echo
通过循环进行正常return
#!/bin/bash
sum=0 # 全局变量
function getsum(){
for ((i=$1; i<=$2; i++)); do
((sum+=i)) # 从$1累加到$2
done
return $?
}
read num1
read num2
if getsum $num1 $num2; then
echo "Final sum is: $sum"
else
echo "Error"
fi
函数内进行return可以出现任意值
调试脚本
-x 在执行的时候显示参数和命令
+x 禁止调试
-v 在命令读取时显示输入
+v 禁止打印输入
-n 检测脚本中语法错误
命令:bash -[参数] [脚本名]