shell入门编程教程(bash)

入门知识

运行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 "-----函数执行完毕-----"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值