shell基础语法

一、shell约定
   shell脚本文件扩展名为.sh
   第一行:#!/bin/bash  #! 表示该脚本所使用的解释器
   chmod +w bash文件名  将该bash修改为可执行
   执行bash方法: ./t.sh
   注意:在执行脚本时可能会出现:
   -bash: ./shell.sh: /bin/bash^M: bad interpreter: No such file or directory的错误
   解决办法:执行sed -i "s/\r//" filename(脚本文件名)  然后在执行脚本
二、变量
   1. shell脚本没有数据类型,在定义变量时,无需使用关键字声明,直接给出变量名:v1="tom"  //注意变量赋值使用双引号
定义变量名要遵循一下规则:
1)变量名的首字符必须为字母
2)不可包含标点
3)不可为关键字
4)中间可包含_
   2. 只读变量:使用readonly修饰,只读变量不可修改 ;用法: readyonly name="zhangsan" 
                      或者 在定义变量之后修饰:name="zhangsan"  readyonly name
   3. 删除变量:使用关键字unset 变量名 例如:unset name    删除该变量之后,该变量的值为空
   4. 变量的使用:${变量名}  或 $变量名   例如:echo "my name  is ${name}"   这个时候一定要加上{}

   5. 特殊变量:具有特定含义的变量,例如:$$ 表示当前shell的pid
经常使用的特殊变量有:
 $0 当前脚本的文件名
      $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
      $# 传递给脚本或函数的参数个数。
      $* 传递给脚本或函数的所有参数。
      $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
      $? 上个命令的退出状态,或函数的返回值。
      $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
 其中$*与$@都表所有的参数,但是当参数使用双引号时,例如("zhangsan" "lisi") $@表示的参数以空格隔开,而$*没有
 $? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,
 大部分命令执行成功会返回 0,失败返回 1。不过,也有一些命令返回其他值,表示不同类型的错误。
 三、 转义字符:/n /t /f /r   在使用转义字符的时候,要使用-e 说明
 例如:a=10
            echo  -e "the num a is ${a} \n"
得到的结果是the num a is 10 (后面有一个空行)  不加-e 则输出the num a is 10 \n
 四、命令替换:指将命令执行的结果保存起来,在适当的时候输出
      使用方法:`command` (注意此处的``是esc键下的)
 例如:Date=`data`
       echo $Date
 五、变量替换:根据变量的状态(是否为空或者unset)来改变它的值
     ${var:-word} 如果var为空或者被unset,则返回word(此处的word并不是变量,而是一个值),不改变var的值
${var:=word} 如果var为空或者被unset,则返回word,并且将word赋给var
${var:?messgae} 如果var为空或者被unset,则直接message输出  并且停止运行
${var:+word}   如果var不为空或者没有被unset 则返回word,不改变var的值
例如:
   #!/bin/bash
num1=10
num2=12
unset num1
message="error num1 is null or unseted"
i=${num1:-num2}  #num2  此时num1仍然处于被删除状态
echo $i 
i=${num1:=num2}   #num2 此时num1的值变为num2
echo $i
i=${num1:+message} #message 此时num1的值为num2
echo $i
unset num1 
i=${num1:?message} #message  此时抛出message  并且不执行后面的echo
echo $i 


  六、运算符
     1. 算数运算符 
   a=20 b=10
+ 加法 `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。 [ $a != $b ] 返回 true。
  注意:表达式和运算符之间要有空格
    ·expr $a == $b·  结果是0
    ·expr $a != $b·  结果是1
不可使用i=[ $a == $b ] 进行赋值,通常用于if中 
2. 关系运算符(只支持数字或数字字符串)
   -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-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。
注意:[ 与 $a 之间要有空格
  
3. 布尔运算符
   ! 非运算,表达式为 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. 字符串运算符
    = 检测两个字符串是否相等,相等返回 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。
5. 文件测试运算符 
   文件测试运算符用于检测 Unix 文件的各种属性。
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $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。


  七、注释:sh里没有多行注释,只能每一行加一个#号。
  八、字符串:即可用单引号,也可用双引号(最好使用双引号)
       单引号字符串的限制:
           单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
           单引号字串中不能出现单引号(对单引号使用转义符后也不行,内部使用单引号无效)
  双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
1,字符串拼接  语法:"str1"$str2"" 或 ""$str1""str2"",即内部嵌套
2,字符串的长度 语法:${#str},例如 str="abc" echo ${#str} 得到3
        3,提取字符串 语法:${str:begin:length}/${str:begin} 例如:str="abcd" echo ${str:1:2} 得到bc
        4,查找字符串 语法: ·express index "$str" s· 例如:str="my name is tom" echo `expr index "$str" tom`
  九、数组
      bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始编号。获取数组中的元素要利用下标,
 下标可以是整数或算术表达式,其值应大于或等于0。
 用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value1 ... valuen)
 或array_name[0]=value1 array_name[n]=valuen 单独定义
 读取数组:${array_name[n]} //n表示下标,从0开始、可以是变量、表达式
 数组大小:${#array_name[*]} 或 ${#array_name[@]}
 输出数组所有元素:${array_name[*]} 或 ${array_name[@]}
  十、控制结构
      1.if选择 
        if[] then fi
   if[] then else fi
if[] then elsif else  fi
 2.for循环
         for var in 列表(用空格隔开,注意不能是一个数组变量)
          do
         done
      3.while循环
         while []
         do
         done
      4.until []
   do
   done
注意:while与unitl的判断正好相反,while为true时继续执行,而until为true则退出
      5.case var in conditions) command ;; esac
        例如:  
         case $num in
          1)
           echo "you print 1"
            ;;
          2)
           echo  "you print 2"
           ;;
         *)
          echo "you num ..."
           ;;
         esac
       
 break、continue:break是终止循环,continue是直接执行下此次循环,跳过continue后的
 
  十一、函数
       Shell 函数必须先定义后使用。函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
       Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如
  一个字符串,往往会得到错误提示:“numeric argument required”。如果一定要让函数返回字符串,那么可以先定义一个变量,
  用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
  函数的调用:函数名称即可,如果有参数,直接在函数名后面用空格隔开(调用不需要())
   str="abc"
function hello()
{
 echo $str
 str="def"
 echo "hello"
 
 return 22  //如果有返回值,则使用return ,那么$? 的结果return后的结果 ,如果没有返回值$?为0或其他数字
}
hello
echo $?
echo $str
得到的结果:abc
hello
22
def
----------------------------------------
function hi()
{


 echo "hi $*"
}
        hi "tom" "jack"
得到的结果:hi tom jack
$*:所有参数 $n:第n个参数 $#:参数的个数

删除函数:unset 函数名  例如:unset hi
unset -v 变量名  unset -f 函数名
unset 函数名或变量名

   十二、shell文件包含:一个shell文件可以包含另一个shell文件,使用source 文件名 或. ./文件名,其中函数名和变量可以共享
         shell.sh
#!/bin/bash
function hi()
{
  ` cd /home/hollysp/22 `
  ` touch t4.sh `
 
}
t1.sh
 #!/bin/bash
source shell.sh #. ./shell.sh 注意第一个点和第二个点之间要有空格
hi
        调用./t1.sh  查看文件创建成功


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值