shell基础

shell

1、shell中的特殊变量

1-1、特殊变量

 

1-2、$* 和 $@

$* 和 $@ 的区别为: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

1-3、$?

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

2、echo 的选项

2-1、-e

用后面的内容对转义字符进行替换

例:echo -e "\\"                                                  结果:\

         echo -e "\\\\"                                              结果:\

         echo -e "\1abc\\de\\\2fgh\\\\ijklmn"      结果:\1abc\de\2fgh\ijklmn

2-2、-n

禁止插入换行符(包括echo自带的换行符也将失效)

2-3、-E

禁止转义字符,但对"\\"无效

3、变量

3-1、只读变量

readonly 变量

3-2、删除变量

unset 变量

4、替换

4-1、命令替换

把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来

例:

result=`pwd`

echo $result

结果:

/home/sl

4-2、变量替换

 

5、运算符

5-1、算术运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr. 下面使用expr进行;  expr是一款表达式计算工具,使用它可以完成表达式的求值操作;

注意:

         1. 在expr中的乖号为:\*

         2. 在 expr中的 表达式(或者变量)与运算符之间要有空格,否则错误;

         3. 在[ $a == $b ]与[ $a != $b ]中,要需要在方括号与变量以及变量与运算符之间也需要有空格, 否则为错误的。

         4、表达式必须用反引号括起来

5-2、关系运算符

 

5-3、布尔运算符

 

5-4、字符串运算符

 

5-5、文件测试运算符

 

6、字符串

6-1、单引号的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
  • 双引号里可以有变量
  • 双引号里可以出现转义字符

6-2、双引号的优点:

6-3、字符串操作

1、字符串长度

${#str}

2、子串

${str:1:4}

3、字符串是否包含子串

expr index "$str" substr

4、路径字符串

4-1、basename

得到文件名

例:

result=`basename /home/sl/a.sh`

echo $result

结果:a.sh

result=`basename /home/sl `

echo $result

结果:sl

4-2、dirname

得到路径名

例:

result=`basename /home/sl/a.sh`

echo $result

结果:/home/sl

result=`basename /home/sl `

echo $result

结果:/home

7、数组

7-1、定义

1、在shell中用括号表示数组,元素用空格分开

2、下标从0开始,可以使用不连续的下标,而且下标的范围没有限制,但不许是自然数

7-2、读取数组的全部元素,用@或*

${array_name[*]}或者${array_name[@]}

7-3、数组的长度

${#array_name[*]}或者${#array_name[@]}

7-4、获取数组的所有下标

${!array_name[*]}或者${#array_name[@]}

7-5、获取数组元素的长度

${#array_name[i]}

8、函数

8-1、printf

  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号。
Ø  如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替

8-2、exit

退出shell

8-3、read

从键盘读取

-p:输入提示

-t:输入等待计时

-n:输入字符个数控制

-s:输入不显示在监视器上(实际上数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)

read line:读文件

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

#!/bin/bash

count=1    //赋值语句,不加空格

cat test | while read line        //cat 命令的输出作为read命令的输入,read读到的值放在line中

do

   echo "Line $count:$line"

   count=$[ $count + 1 ]          //注意中括号中的空格。

done

echo "finish"

exit 0

8-4、

9、语句

9-1、if语句

if [ 表达式] then 语句  elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句   ……else 语句 fi

例:

if [ $a == $b ]

     then

         echo "a等于b"

else

     echo "a!=b"

fi

或者

if [ $a == $b ]; then echo "a==b"; else echo "a!=b"; fi;

9-2、case语句

取值后面必须为关键字 in,每一模式必须以右括号结束。

;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。2. 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

read -t 30 -p "please input your digit:" a

case $a in

1)

     echo "a==1";;

2)

     echo "a==2";;

3)

     echo "a==3";;

*)

     echo "a > 3";;

esac

9-3、循环语句

1、for

for 变量 in 列表
do
    ……
done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。
for FILE in $HOME/*.sh
do
   echo $FILE
done

2、while

while command
do
   Statement(s) to be executed if command is true
done
i=0
while [ $i -lt 5 ]
do
    i=`expr $i+1`
    echo $i
done

3、until

until command
do
……
done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

until [ $i -gt 10 ]

do

     echo $i

     i=`expr $i + 1`

done

10、函数

1、定义

function_name () {
    list of commands
    [ return value ]
}

也可以加上function关键字:

function function_name () {
    list of commands
    [ return value ]
}

1. 调用函数只需要给出函数名,不需要加括号。

2. 函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

3. Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。

4. 函数的参数可以通过 $n

5、定义的时候不用写参数

2、调用

function_name 参数列表(空格分开)

3、删除函数

unset .f function_name

11、引入外部脚本

. filename
#或
source filename

1. 两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。

2. 被包含脚本不需要有执行权限。

 

posted @ 2018-11-16 17:05  束发读诗书  阅读(196)  评论(0编辑  收藏  举报