shell学习

/#!/bin/bash
echo “Hello World !”
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

shell变量

  1. 定义变量

     定义变量时,变量名不加($)。
     首个字符必须为字母(a-z,A-Z)。
     中间不能有空格,可以使用下划线(_)。
     不能使用标点符号。
     不能使用bash里的关键字(可用help命令查看保留关键字)。
     重新定义只需重新赋值
     若要变量只读只需添加readonly 变量名
    
  2. 使用变量

     使用定义过的变量,只需变量名前加($)。{}是可选的
     删除变量只需 unset 变量名
    
  3. 变量类型

     1) 局部变量
     2) 环境变量
     3) shell变量
    
  4. 特殊变量

$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(” “)包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。
但是当它们被双引号(” “)包含时,”$*” 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@” 会将各个参数分开,以”$1″ “$2” … “$n” 的形式输出所有参数。

shell替换

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

a=10
echo -e "Value of is $a \n"
转义字符:\\反斜杠,\b退格,\a警告,\f换页,\n换行,\r回车,\t水平制表符,\v垂直制表符
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。

  • 命令替换
    命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。`command`

    DATE=`date`
    echo “Date is $DATE”

  • 变量替换
    ${var} 变量本来的值
    ${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
    ${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
    ${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
    ${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

Shell运算符

算术运算符:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号。

a=10   
b=20 
val=`expr $a + $b`
if [ $a == $b ]
then
fi

注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。
关系运算符:
-eq相等, -ne不相等, -gt左是否大于右, lt左小右, -ge左大等右, -le左小等右

if [ $a -eq $b ]
then
fi

布尔运算:
!非, -o 或, -a与

if [ $a -lt 5 -o $b -gt 100 ]
then
fi

字符串运算符:

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

文件测试运算符:

文件测试运算符用于检测 Unix 文件的各种属性。
-b 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-d 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

 if [ -r $file ]
 then
 echo "File has read access"
 else
 echo "File does not have read access"
 fi 

数组定义

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开
array_name=(value0 value1 value2 value3)

${array_name[index]}读取数组
length=${#array_name[*]}数组长度

echo,printf

echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串

printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。

printf "%d %s\n" 1 "abc"单引号和双引号效果一样

格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s abc def
abcdef

if esle

if .. then … fi 语句;
if … else … fi 语句;
if .. then… elif .. then… else … fi 语句。

case esac

case 值 in  
模式1)  
command1  
command2  
;;  
模式2)  
command1  
command2  
command3  
;;  
*)  
command1  
command2  
command3  
;;  
esac  

for ,while,break

for 变量 in 列表  
do  
command1  
command2  
...  
commandN  
done  

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

while command  
do  
 Statement(s) to be executed if command is true  
done  

break n 表示跳出n层循环

    原文作者:c_xiaoqiang
    原文地址: https://www.jianshu.com/p/357be49e770b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞