Shell学习笔记

Shell脚本第一行必须是如下格式:

#!/bin/sh

符号#!用来指定该脚本文件的解析程序。

当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。

可以用如下命令:chmod +x filename

注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。如果使用了注释,即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。

变量

在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明。

#!/bin/sh
#set variable a
a="hello world"
#print a
echo "A is:"
echo $a

有时候变量名很容易与其他文字混淆。

num=2

echo "this is the $numnd"

这并不会打印出"this is the 2nd",而仅仅打印"this is the",因为shell会去搜索变量numnd的值,但是这个变量是没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

num=2

echo "this is the ${num}nd"

默认变量

$#:传入脚本的命令行参数个数

$*:所有命令行参数值,在各个参数值之间留有空格

$0:命令本身(shell文件名)

$1:第一个命令行参数

$2:第二个命令行参数

例:s3

#!/bin/sh
echo "number of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4

运行:./s3 1 2 3 4

输出:

number of vars:4

values of vars:1 2 3 4

values of var1:1

values of var2:2

values of var3:3

values of var4:4

局部变量

在变量首次被赋值时加上local关键字可以声明一个局部变量。

例:s4

#!/bin/sh
hello="var1"
echo $hello
function func1
{
    local hello="var2"
    echo $hello
}
func1
echo $hello

输出: 

var1

var2

var1

注意:

  1. 变量赋值时,“=”左右两边都不能有空格
  2. BASH中的语句结尾不需要分号

if语句

if [expression]
then
    #code block
fi

if [expression]
then
    #code block
else
    #code block
fi

if [expression]
then
    #code block
else if [expression]
    then
        #code block
    else
        #code block
    fi
fi

if [expression];then
    #code block
elif [expression]
    then
        #code block
    else
        #code block
    fi
fi

比较

比较操作整数操作字符串操作
相同-eq=
不同-ne!=
大于-gt>
小于-lt<
大于或等于-ge 
小于或等于-le 
为空-z 
不为空-n 

例:

比较整数a和b是否相等:if [$a = $b] (也可用eq)

判断整数a是否大于整数b:if [$a -gt $b]

比较字符串a和b是否相等:if [$a = $b]

判断字符串a是否为空:if [-z $a]

判断整数变量a是否大于b:if [$a -gt $b]

注意:

  1. 在“[”和“]”符号的左右都留有空格
  2. “=”左右都有空格

判断

-e文件已经存在

-f 文件是普通文件

-s 文件大小不为零

-d 文件是一个目录

-r 文件对当前用户可以读取

-w 文件对当前用户可以写入

-x 文件对当前用户可以执行

例:s5

#!/bin/sh
folder=/home
[-r "$folder"] &&echo "can read $folder"
[-r "$folder"] || echo "this is not file"

for循环

for循环结构与C语言中有所不同,在BASH中for循环的基本结构是

for var in [list]
do
    #code block
done

其中$var是循环控制变量,[list]是var需要遍历的一个集合,do/done对包含了循环体,相当于C语言中的一对大括号。另外如果do和for被写在同一行,必须在do前面加上“;”。如:for $var in [list];do

例:s6

#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
    echo $day
done

输出:

Sun

Mon

Tue

Wed

Thu

Fri

Sat

如果列表被包含在一对双引号中,则被认为是一个元素。

例:s8

#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
    echo $day
done

输出:

Sun Mon Tue Wed Thu Fri Sat

在上面的例子中,在for所在那行,变量day是没有加“$”符号的,而在循环体内,echo所在行变量$day是必须加上“$”符号的。

while循环

while循环的基本结构是:

while [condition]
do
    #code block
done

until循环

until循环的基本结构是:

until [condition]
do
    #code block
done

while和until的区别在于while是为真时执行,until是为假时执行。

case语句

BASH中的case结构与C语言中的switch语句的功能比较类似,可以用于进行多项分支控制。

case "$var" in
    condition1)
        ;;
    condition2)
        ;;
    *)
        default statments;;
esac

例:s7

#!/bin/bash/
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
    [A-Z]) echo  "Uppercase letter";;
    [a-z])  echo  "Lowercase letter";;
    [0-9]) echo  "Digit";;
    *) echo  "Punctuation,whitespace, or other";;
esac
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值