shell基础

 : jank    :   : 2519    : 2016-09-27 08:17  linux

一.执行语句:sh -x test.sh

二.shell变量:

1. 命名:

name="jank"

注意:1赋值时等号两边不许有空格,

 2首个字母必须为音文字母a~b,A~B

 3不能使用标点

 4不能使用shell里的关键字

    

    2. 使用变量:$ (使用变量时必须加 $ 符号)

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

   name="jank"

   echo $name

   echo ${your_name}//大括号可加可不加,但是无空格拼接字符时必须加

    3. 只读变量:readonly 只读变量只能读,否则报错

    name="jank"

    readonly name

    name="zhankui"

    echo $name

    输出:'mysql-listen-del.sh: line 4: name: readonly variable'

4. 删除变量:unset

   name="jank"

   unset name

   echo $name

   输出:空

三.字符串:

1. 类型:shell字符串可以使单引号可以是双引号,还可以不用引号。shell中的单双引和php中的定义是一致的。

2. 字符串拼接:

name="jank"

names="welcome $name"

age="${name}22"

echo $names $age           //注意:输出多个变量不需要像php加逗号,可直接输出

3. 获取字符串长度:只需在大括号中加 #

name="jank"

echo ${#name}

输出:4

4. 截取字符串:

name="jank"

echo ${name:1:2} 

输出:an

5. 查找子字符串

name="jank"

echo `expr index $name a`        //注意:是反引号,而不是单引号

输出:2


四.shell传递参数

#!/bin/bash

echo 文件名:$0

echo 输入参数1:$1

echo 输入参数2:$2

执行:chmod o+x ./test.sh

     ./test.sh 11 22

输出:输入参数1:11

 输入参数2:22        


$1  传递的第一个参数

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

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

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的ID号

$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$- 显示Shell使用的当前选项,与set命令功能相同。

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误       


五.shell数组

1. 设置数组2种方法

1 user=array(jank 23 jiangxi)


2 user[0]=jank

 user[1]=23

 user[2]=jiangxi

2. 获取数组

${user[0]}

3. 获取数组中的所有元素

${user[*]}

或:

${user[@]}

4. 获取数组的长度

${#user[*]}

或:

${#user[@]}

六.shell运算符

1. 算数运算符

#!/bin/bash

echo `expr 1 + 2` //注意:使用反引号, 运算符左右两边需要空格


a=10

b=20

+ 加法 `expr $a + $b` 结果为 30。

- 减法 `expr $a - $b` 结果为 -10。

* 乘法 `expr $a * $b` 结果为  200。

/ 除法 `expr $b / $a` 结果为 2。

% 取余 `expr $b % $a` 结果为 0。

= 赋值 a=$b 将把变量 b 的值赋给 a。

== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。

!= 不相等。用于比较两个数字,不相同则返回 true。


2. 关系运算符


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。

3. 布尔运算符

a=10

b=20

! 非运算,表达式为 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。

4. 逻辑运算符

a=10

b=20

&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

5. 字符串运算符

a='abc'

b='edf'

= 检测两个字符串是否相等,相等返回 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。

6. 文件测试运算符

例:

   #!/bin/bash

file='/shell/test.sh'

if [ -f $file ]             #注意空格

then

 echo 'is file'

else

 echo 'not file'

fi

输出:

is file


-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。

-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。

-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。

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

-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

七.echo 命令

1. 显示普通字符串:

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.显示换行

echo -e "OK! " # -e 开启转义

echo "It it a test"

输出结果:

OK!


It it 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" > /shell/text.txt   #向text.txt中写入(会覆盖), >> 命令则会自动向下添加

7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name"'

输出结果:

$name"

8.显示命令执行结果"

 echo `date`    #反引号

结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

八.printf 命令

1. printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 。

2. printf 命令的语法:

printf  format-string  [arguments...

例:

#!/bin/bash

# author:菜鸟教程

# url:www.runoob.com

 

printf "%-10s %-8s %-4s " 姓名 性别 体重kg  

printf "%-10s %-8s %-4.2f " 郭靖 男 66.1234 

printf "%-10s %-8s %-4.2f " 杨过 男 48.6543 

printf "%-10s %-8s %-4.2f " 郭芙 女 47.9876 

执行脚本,输出结果如下所示:

姓名     性别   体重kg

郭靖     男      66.12

杨过     男      48.65

郭芙     女      47.99

%s %c %d %f都是格式替代符

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数

3. printf的转义序列

a 警告字符,通常为ASCII的BEL字符

 后退

c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略

f 换页(formfeed)

换行

回车(Carriage return)

水平制表符

v 垂直制表符

\ 一个字面上的反斜杠字符

ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效

ddd 表示1到3位的八进制值字符

九. test 命令

1. Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

例:

1数值

#!/bin/bash

num1=100

num2=100

if test $[num1] -eq $[num2]

then

   echo '两个数相等!'

else

   echo '两个数不相等!'

fi

输出:

两个数相等


2字符

#!/bin/bash

num1="runoob"

num2="runoob"

if test num1=num2

then

   echo '两个字符串相等!'

else

   echo '两个字符串不相等!'

fi

3文件

#!/bin/bash

if test -e ./text.txt

then

   echo '文件已存在!'

else

   echo '文件不存在!'

fi

4逻辑判断

if test -e ./test.sh -o -e ./text.sh

then

   echo '至少有一个文件存在!'

else

   echo '两个文件都不存在'

fi

十. shell 流程控制

1. if elif else逻辑判断

#!/bin/bash

a=10

b=20

if [ $a == $b ]

then

   echo 'a = b'

elif [ $a > $b ]

then 

echo 'a > b '

else

echo 'a < b'

fi

2. for循环

当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

例:1输出数字

#!/bin/bash

for num in 1 2 3 4 5

do 

echo "数字:$num"

done

输出:

数字1

数字2

数字3

数字4

数字5


2输出字符串

for str in "hello jank"

do

echo $str

done

输出:

hello jank


3. while循环

1普通循环

#!/bin/sh

int=1

while(( $int<=5 ))

do

   echo $int

   let "int++"       #let命令执行函数

done


2while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

#!/bin/bash

echo '按下 <CTRL-D> 退出'

echo -n '输入你最喜欢的电影名: '

while read FILM            #read命令为输入

do

   echo "是的!$FILM 是一部好电影"

done

3case 命令

#!/bin/bash

   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 #结束标记

4break 命令:跳出全部循环

#!/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

5continue 命令:跳出当前循环

十一.shell 函数

1. 普通函数调用

#!/bin/bash

   user(){

    echo 'jank'

   }

   user

   注意:

1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

2.return

#!/bin/bash

funWithReturn(){

   echo "这个函数会对输入的两个数字进行相加运算..."

   echo "输入第一个数字: "

   read aNum

   echo "输入第二个数字: "

   read anotherNum

   echo "两个数字分别为 $aNum 和 $anotherNum !"

   return $(($aNum+$anotherNum))

}

funWithReturn

echo "输入的两个数字之和为 $? !"

3.传参

#!/bin/bash

funWithParam(){

   echo "第一个参数为 $1 !"

   echo "第二个参数为 $2 !"

   echo "第十个参数为 $10 !"

   echo "第十个参数为 ${10} !"

   echo "第十一个参数为 ${11} !"

   echo "参数总数有 $# 个!"

   echo "作为一个字符串输出所有参数 $* !"

}

funWithParam 1 2 3 4 5 6 7 8 9 34 73


   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com