Shell教程快速入门

Shell即是一种命令语言,又是一种程序设计语言,使用者可以通过Shell访问操作系统的内核服务。

Shell编程和java、python、C一样,只要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了,Linux的Shell种类众多,我们只需要关注 Bash(Bourne Again Shell  (/bin/bath))

 #! /bin/sh 和 #! /bin/bash 没多大区别, #! 告诉系统需要什么解释器来执行该Shell脚本程序。

shell的打印输出函数 echo

从键盘获取输入信息函数  read 

read  name                   //从键盘数据保存在name变量中
echo "从键盘获取的信息是 $name" 

1、read命令提供了-p参数,-p后面的字符串会显示出来

read -p "输入第一个数字:" a    #获取键盘输入的 a 变量数字
read -p "输入第二个数字:" b    #获取键盘输入的 b 变量数字
r=$[a+b]                    #计算a+b的结果 赋值给r  不能有空格
echo "sum = ${r}"        #输出显示结果 r

输出结果

输入第一个数字:1
输入第二个数字:2
sum = 3

2、计时输入

使用read命令存在着潜在危险。脚本会阻塞下来等待用户的输入。如果无论是否输入数据脚本都必须继续执行,可以使用-t选项指定一个计时器。

if read -t 5 -p "please enter your name:" name
then
    echo "hello $name ,welcome to my script"
else
    echo "sorry,too slow"
fi

3、设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
      echo "fine ,continue";;
N | n)
      echo "ok,good bye";;
*)
     echo "error choice";;
esac

使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出

4、读文件

还可以使用read命令读取Linux系统上的文件。每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是将文本中的数据传送给read命令,最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

count=1    //赋值语句,不加空格
cat test | while read line        //cat 命令的输出作为read命令的输入,read读到的值放在line中
do
   echo "Line $count:$line"
   count=$[ $count + 1 ]          //注意中括号中的空格。
done
echo "finish"
exit 0

Shell单行注释  # 注释内容 

多行注释

:<<EOF
注释内容...
注释内容...
EOF

EOF也可以使用其他字符,只要前后保持一致就行。

运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #在当前目录执行脚本test.sh

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh

3、在Git Bash命令行中运行.sh文件

$ sh test.sh

Shell变量

定义变量时,变量名不加美元符号"$",如:

you_name="LXP-Never"

变量名和等号之间不能有空格, 这和我们熟悉的python编程语言不一样,但是变量名的命名规则是一样的。

使用变量

使用一个定义过的变量,只需在变量名前面加美元符号即可

name="LXP"
echo $name
echo ${name}

变量名外面的花括号是可选的,加不加都行,如果加了花括号更加方便的识别变量的边界。推荐给所有的变量加上花括号,这是一个好的编程习惯。

只读变量  readonly name,只读变量的值不能被改变,不能被unset删除

删除变量  unset name

Shell字符串,字符串可以用单引号' ',也可以用双引号" ",也可以不用。但是使用双引号可以用$符号使用变量,还可以使用转义字符\

your_name="runoob"
# 使用双引号拼接,也可以换成单引号
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1            # hello, runoob ! hello, runoob !

获取字符串长度

string="abcd"
echo ${#string}            # 4
expr length "$string"    # 4

提取子字符串

以下实例从字符串第2个字符开始截取4个字符,取不到开始索引

var="http://www.aaa.com/123.htm"
echo ${string:1:4}     # ttp:

 从左边第几个字符开始,一直到结束,取不到开始索引

echo ${var:7}    # is a great site

 从右边第几个字符开始,的几个字符

echo ${var:0-7:3}    # 123

 从右边第几个字符开始,一直到结束。

echo ${var:0-7}    # 123.htm

Shell数组

从0开始索引

定义数组,用空格分割不同的数组元素

array_name=(value1 value2 value3 ...valuen)

读取数组

读取数组元素值得一般格式是:

${数组名[下标]}

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素

echo ${array_name[@]}

获取数组的长度

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

截取

###号截取,删除边的字符  ${var#*//}  # 删除var左边的字符,直到遇到第一个//

%%%号截取,删除边的字符  ${var%//*}  # 删除var左边的字符,直到遇到第一个//

var=http://www.aaa.com/123.htm
echo ${var#*//}    # www.aaa.com/123.htm
echo ${var##*/}    # 123.htm
echo ${var%/*}        # http://www.aaa.com
echo ${var%%/*}    # http:

关系运算符

关系运算符只支持数字,不支持字符串

a=10  b=20

运算符说明举例

-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。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性性。

  操作符                说明                              举例                                                
-d file 检测文件是否是目录(在linux中目录就是文件夹的意思),如果是,则返回 true。 [ -d $file ] 返回 false。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

布尔运算符

运算符说明举例

!

非运算

[ ! false ] 返回 true。

-o

或运算

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与运算

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

运算符说明 举例     

&&

逻辑的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||

逻辑的 OR

[[ $a -lt 100 || $b -gt 100 ]] 返回 true

 

字符串运算符

运算符说明举例

=

检测两个字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

检测两个字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

检测字符串长度是否为0,为0返回 true。

[ -z $a ] 返回 false。

-n

检测字符串长度是否为0,不为0返回 true。

[ -n "$a" ] 返回 true。

str

检测字符串是否为空,不为空返回 true。

[ $a ] 返回 true。

Shell流程控制

if else

if condition1
then
  command1
elif condition2
then
  command2
else
  command3
fi

for循环

for var in item1 item2 ... itemN
do
  command1
done

while语句

while condition
do
  command
done

case

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

case num in
  1) command1
  ;;
  2) command2
  ;;
esac

跳出循环:breakcontinue

Shell函数

funname(){
  echo "这是我的第一个Shell函数"
}
echo "调用函数"
funname

 

可以使用return返回函数

函数参数

在函数内部通过使用 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第十个参数为 ${10} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第十个参数为 10 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

$#  传递到脚本的参数个数

$*  以一个单字符串显示所有向脚本传递的参数

shell文件导入

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

如:

test1.sh文件内

url="作者的名字是:"

在test2.sh脚本文件内导入test1.sh脚本

. ./test1.sh
echo "${url}不告诉你"

添加可执行权限并执行,然后执行test2.sh脚本,

$ chmod +x test2.sh 
$ ./test2.sh 
作者的名字是:不告诉你

参考文献

linux菜鸟教程

posted @ 2019-01-02 18:17  凌逆战  阅读(1004)  评论(0编辑  收藏  举报