shell基础全解

shell

  • #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。 #!/bin/bash
  • chmod +x ./test.sh #使脚本具有执行权限
  • ./test.sh #执行脚本

Shell 教程 | 菜鸟教程 (runoob.com)

1、shell 变量

定义变量 :

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里面的关键字(可用help命令查看保留关键字)
有效的Shell变量名示例如下: 
RUNOOB 
LD_LIBRARY_PATH 
_var

无效的变量命名:
?var=123 
user*name=runoob

使用变量:

    your_name="qinjx"
    echo $your_name
    echo ${your_name}

只读变量:
    //使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
    #!/bin/bash

    myUrl="https://www.google.com"
    readonly myUrl
    myUrl="https://www.runoob.com"

    运行脚本,结果如下:

    /bin/sh: NAME: This variable is read only.

删除变量:
    #!/bin/sh

    myUrl="https://www.runoob.com"
    unset myUrl
    echo $myUrl

    以上实例执行将没有任何输出。

2、shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号

str=‘this is a string’

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。

  • 单引号字符串中不能出现单引号(对单引号使用转义符后也不行)。

双引号

your_name="qinjx"str=“hello,i know your are “$your_name”!\n”

  • 双引号里可以有变量

  • 双引号里可以出现转义字符

    hard quote:‘’(单引号),关闭所有引用

    soft quote:“”(双引号),保留$引用

拼接字符串

your_name=“qinjx”

  • greeting=“hello,”$your_name" !"

  • greeting_1=“hello,${your_name} !”

  • echo $greeting $greeting_1

获取字符串长度

string=“abcd”

echo ${#string} #输出4

提取子字符串

string=“runoob is a great site”

echo ${string:1:4} #输出unoo

查找子字符串

string=“runoob is a great company”

echo expr index "$string" is #输出8

注意:以上脚本中“

echo `expr”是反引号,而不是单引号。

使用expr命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会

输出表达式本身:

expr 5+6 # 直接输出5+6

expr 5 + 6 # 输出11

对于某些运算符,还需要我们使用符号“

\”进行转义,否则就会提示语法错误。

expr 5 * 6 # 输出错误

expr 5 * 6 # 输出30

3、Shell 数组

定义数组:

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

array_name=(value0 value1 value2 value3)

array_name=(
value0
value1
value2
value3
)

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组:

${数组名[下标]}
valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

获取数组的长度:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

4、shell 函数

shell 参数

向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

实例:

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KR4m4WJY-1660978102560)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660964232441.png)]

shell 函数
  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
[ function ] funname [()]

{

    action;

    [return int;]

}
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

输出结果:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

5、Shell 基本运算符

Shell和其他编程一样,支持多种运算符,包括:

  • 算术运算符

  • 关系运算符

  • 布尔运算符

  • 字符串运算符

  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr

最常用。

例:两个数相加(注意使用的是反引号 ` 而不是单引号 ‘ ):

var=expr 2 + 2

echo "两数之和为:

$var

算术运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zNoVLcLI-1660978102564)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660973356460.png)]

实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

关系运算符
  • 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
  • 下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqCo9o8n-1660978102568)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660973491484.png)]

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

逻辑运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTdQ8H8v-1660978102570)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660973678569.png)]

实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

返回 false
返回 true

字符串运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlAGRiCv-1660978102571)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660973775605.png)]

实例

字符串运算符实例如下:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0kVD9Me-1660978102573)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660973918861.png)]

实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

文件可读
文件可写
文件可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在

6、Shell 流程控制

if else
if condition
then
    command1 
    command2
    ...
    commandN 
fi


if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi


if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for 循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

实例:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

#!/bin/bash

for str in This is a string
do
    echo $str
done

This
is
a
string

while循环:
while condition
do
    command
done

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

1
2
3
4
5

无限循环

无限循环语法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:breakcontinue

break 命令:

break 命令允许跳出所有循环(终止执行后面的所有循环)。

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

实例:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

执行以上代码,输出结果为:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

continue:

continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

对上面的例子进行修改:

实例:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。

until 循环
until condition
do
    command
done

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

输出结果为:

0
1
2
3
4
5
6
7
8
9

case … esac

case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case … esac 语法格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

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

#!/bin/sh

site="runoob"

case "$site" in
   "runoob") echo "菜鸟教程"
   ;;
   "google") echo "Google 搜索"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac

输出结果为:

菜鸟教程

7、Shell 输入/输出重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pFkoWt2-1660978102575)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1660977534989.png)]

8、Shell 文件包含

. filename   # 注意点号(.)和文件名中间有一空格

或

source filename

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"

重要的命令:

echo:
//1、显示普通字符串
echo "It is a test" 等价于 echo It is a test

//2.显示转义字符
echo "\"It is a test\""
结果将是:
"It is a test"

//3.显示变量
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

//4.显示换行 # -e 开启转义
echo -e "OK! \n" 
echo "It is a test"
输出结果:

OK!

It is a test

//5.显示不换行
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
输出结果:

OK! It is a test

//6.显示结果定向至文件
echo "It is a test" > myfile

//7.原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
输出结果:

$name\"

//8.显示命令执行结果
echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 '。

结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

echo -n  # 取消换行符
echo -e  # 启用反斜杠转译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值