shell教程
=============================shell脚本=================================
脚本实例:
#!/bin/bash 声明解释器
for i in $(ls /etc);do
echo $i
done
readonly 变量名 ----- 使变量变为只读,不可删除
unset 变量名 ------- 删除变量,但是不能删除只读变量
字符串中---单引号:无变量,没有转移符
---双引号:可有变量,可出现转义符
shell 中的字符串拼接,不用加+,python需要
echo ${#变量} 获取字符串长度
echo ${变量:1:3} 切片,左右都包括
shell中定义数组: li=(1 2 3)
或者 li[0]=1
li[1]=2
li[2]=3
读取 ${li[n]} 利用索引取值
${li[@]} 取出所有
获取数组长度
len=${#li[@]}
len=${#li[*]}
len=${#li[n]} 取数组内单个元素的长度
传参:
echo "shell 传递参数实例!";
echo "shell 执行的文件名:$0"; $0代表文件名
echo "shell 第一个参数为:$1";
echo "shell 第二个参数为:$2";
chmod +x test.sh 给文件加可执行权限
./test.sh 1 2 执行此文件 test.sh传给$0 1 2 依次传给$1和$2
其他补充:
$# 传递到脚本的参数个数
$* 以单个字符串的形式显示参数,把所有参数作为一个整体形成一个大字符串
$@ 与$*差不多,不过是分开的形式
算数运算符:
#!/bin/bash
var=`expr 2 + 2 2 + 2 中间必须有空格,不然无效
echo "两数之和为:$var"
注意: 乘法的时候 必须转义 \*
关系运算符: 只支持数字,不支持字符串,除非字符串是数字
-eq 是否等于
-ne 是否不相等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
布尔运算符:
! 非
-o 或
-a 与
逻辑运算符:
&& AND
|| OR
字符串运算符:
= 检测两个字符串是否相等,相等返回True
!= 检测连个字符串是否不想打,不相等返回True
-z 检测字符串长度是否为0,为0返回True
-n 检测字符串长度是否为0,不为0返回True
str 检测字符串长度是否为空,不为空返回True
文件测试运算符:
...
echo命令:
aa.sh文件
#!/bin/bash
read name
echo "$name haha"
执行./aa.sh文件
输入OK
显示 OK haha
echo -e 开启转义
\n 换行 \c不换行
echo '$name\' 单引号原样输出
echo `date` 输入执行结果 是反引号
printt 例如:printf "Hello, Shell\n" 手动添加\n换行
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
例:printf "%s and %d \n" --->>> and 0
test测试
数值测试
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
例:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
字符串测试
= 等于则为真
!= 不相等则为真
-z 字符串的长度为零则为真
-n 字符串的长度不为零则为真
文件测试
-e 如果文件存在则为真
-r 如果文件存在且可读则为真
-w 如果文件存在且可写则为真
-x 如果文件存在且可执行则为真
-s 如果文件存在且至少有一个字符则为真
-d 如果文件存在且为目录则为真
-f 如果文件存在且为普通文件则为真
-c 如果文件存在且为字符型特殊文件则为真
-b 如果文件存在且为块特殊文件则为真
例:
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。
流程控制
if elif else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while循环
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
FILM监控键盘输入信息
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
until 循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until 语法格式:
until condition
do
command
done
case 匹配模式
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
break continu 与python一样
函数调用:
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
输出类似下面:
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 ! ---->>>> 注意:函数返回值在调用该函数后通过 $? 来获得。
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
输出重定向:> >>追加输出
输入重定向:< 从文件中获取
shell中的文件引用 . ./文件名 或 source ./文件名