这里写目录标题
入门知识
运行shell脚本的方法
shell文件首行要添加 #!/bin/bash 不要省略
注释多使用 #
echo 为打印输出
1.更改权限添加运行权限直接运行(推荐)
chmod 755 test.sh
./test.sh
2.使用解释器
/bin/sh test.sh
变量
注意变量名和等号之间不能有空格
变量分为局部变量与环境变量(全局变量),环境变量每次重启也会消失,可以使用写入系统环境变量文件的方法来使每次开机时添加
变量定义示例
username="zhenya"
pasword=123
使用变量示例
echo $username
echo $pasword
删除变量示例
unset username
unset pasword
字符串操作
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
1.获取字符串长度(#)
username="zhenya"
echo ${#username} # 输出 6
2.截取字符串
{开始位置,截取数量}
username="zhenya"
echo ${username:1:4} # 输出 heny
数组类型
1.定义数组
array=(value0 value1 value2 value3)
2.读取数组
${数组名[下标]}
3.获取数组长度
# 取得数组元素的个数
length=${#array[@]}
# 或者
length=${#array[*]}
# 取得数组单个元素的长度
lengthn=${#array[n]}
Shell 输入/输出重定向
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
加&会在后台进行
栗子
ls &>a.txt
ls &>/dev/null 意思是都扔掉不要不要了
传入参数
$0 为命令本身
$1 为第一个参数 、$2为第二个参数。。。。。
$ * 代表所有参数(作为整体)、$ @也为所有参数(作为离散个体)
$#为参数数量
两个小栗子
1.
#!/bin/bash
# yzy shurucanshu
echo $0
echo "all parameters is cout:$#"
echo "it is : $*"
nums=$(($1+$2))
echo "sum is :"$nums
~
2.
#!/bin/bash
cout=0
for i in "$*"
do
cout=$(($cout+1))
done
echo '$* is cout '$cout
cout=0
for i in "$@"
do
cout=$(($cout+1))
done
echo '$@ is cout '$cout
其他$
$? 为最后一条命令运行是都正确(0为正)
$$为脚本进程 id
数值运算
推荐使用(( )),两个小括号括起来的形式来表示里面的为数学运算
给个栗子
num=$(($num+1))
关系运算符
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
格式化输出
print输出
#!/bin/bash
# format-string为双引号
printf "%d %s\n" 1 "abc" # 1 abc
# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc" # 1 abc
# 没有引号也可以输出
printf %s abcdef # abcdefabcdefabc
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def # def
printf "%s\n" abc def # a b c
# d e f
printf "%s %s %s\n" a b c d e f g h i j
# a b c
# d e f
# g h i
# j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" # and 0
rate=$(df -h |grep "sda1" | awk '{print $5}' | cut -d "%" -f 1)
cut 只能截取制表符分割或指定字符分割的
print一般配合awk使用(自带回车\n,printf不自带)他可以截取空格等
awk '{printf $2 "\t" $6"\n"}' student.txt
输出打印第二行与第六行中间为制表符
sed
sed -n '2p' student.txt 打印第二行
sed -n '2,3p' student.txt 打印第二到三行
流控制语句
都是栗子
if
1.
#!/bin/bash
#统计sda1分区的使用量
rate=$(df -h |grep "sda1" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 80 ];then
echo "warning ,the rate is big than 80%!"
fi
2.
#!/bin/bash
#判断用户输入的文件类型
read -p "please input a filename: " file
#接收键盘输入,赋给变量file
if [ -z "$file" ]
then
echo "please input a filename!"
exit 1
elif [ ! -e $file ]
then
echo "thie filename is not exist!"
elif [ -f $file ]
then
echo "$file is a ordinary file"
elif [ -d $file ]
then
echo "$file is a directory!"
else
echo "it is a niubi file!"
fi
for
1.
#!/bin/bash
for i in 1 2 3 4 5 6 7
do
echo $i
done
2.
#!/bin/bash
ls *.sh > ls.log
nums=0
for i in $(cat ls.log)
do
echo $i
nums=$(( $nums + 1 ))
done
echo "there are $nums files!!"
rm -rf ls.log
3.
#!/bin/bash
sum=0
for((i=1;i<100;i=i+1))
do
sum=$(($sum+$i))
done
echo "from 1 to 100, sum is $sum"
case
#!/bin/bash
echo "1、2 or 3"
read -t 30 -p "please input your chooise:" nums
case "$nums" in
"1")
echo "your chose is 1"
;;
"2")
echo "your chose is 2"
;;
"3")
echo "your chose is 3"
;;
*)
echo "please input 1、2 or 3"
;;
esac
~
~
while
#!/bin/bash
#从1加到100
i=0
s=0
while [ $i -le 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo the sum is: $s
函数
定义格式
[ function ] funname [()]
{
action;
[return int;]
}
# 栗子
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"