Shell从入门到放弃

1、什么是Shell?

shell 由C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一个程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务。

Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
一般我们说的Shell是指shell脚本。

Unix系统中常见的shell有:sh、csh、ksh、tcsh、bash。

2、基本常识

shell脚本必须以 #!/bin/bash 开头。
以#开通的行表示注释,会被解释器忽略。
例如:test.sh

#!/bin/bash
for i in 1 2 3 4 5 
do 
 echo "The value is :$i"
done

执行:

chmod +x test.sh #使该脚本具有执行权限
./test.sh      #执行脚本
/bin/sh test.sh  # 或者,作为解释器参数执行

3、常见语法

变量的定义与赋值
规范
  • 首字母必须为字母
  • 中间不能有空格
  • 不能使用标点符号
  • 不能使用bash里的关键字
赋值

变量没有默认值,所有必须在定义是赋初始值。

#!/bin/bash
MYNAME=Metre
echo ${MYNAME}

注意:等号前后不能有空格。

向Shell传参数

$数字: 表示第几个参数(0,表示执行的文件名)。

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传到脚本的参数个数
$* 以字符串的方式传递所有参数到脚本
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程ID
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误。
运算符

运算符之间一定要有空格,例如 1+1 是错的。必须写成 1 + 1

关系运算符
运算符 说明
-eq 检测两个数是否相等,相等返回true 例如: if [ $a -eq xx ]
-ne 检测两个数是否相等,不相等返回true
-gt 检测左边的数是否大于右边的数,如果是,返回true
-lt 检测左边的数是否小于右边的数,如果是,返回true
-ge 检测左边的数是否大于等于右边的数,如果是,返回true
-le 检测左边的数是否小于等于右边的数,如果是,返回true
布尔运算符
运算符 说明
&& 逻辑与
两竖 逻辑或
字符串运算符
运算符 说明
= 检测两个字符串是否相等,相等返回true
!= 检测两个字符串是否相等,不相等返回true
-z 检测字符串长度是否为0,为0返回true
-n 检测字符串长度是否为0,不为0返回true
str 检测字符串是否为空,不为空返回true 。例如 :n=“abc” if[$a] 返回true
流程控制

if语句 和 for循环 和 while 循环。

#!/bin/bash
a=2 #变量
b=2  #变量
#if语句
if [ $a == $b ]  #注意空格   if 和 [ 和 $a 和 == 之间都必须有空格。
then   
    echo "a 等于 b"
elif [ $a -lt $b ]
then
    echo "a 小于 b"
else
    echo "a 大于 b"
fi #fi结束

for i in 1 6 7 8 # for循环
do
    echo "for1 The value is:${i}"
    #加入判断
    if [ ${i} == 7 ]
    then
        echo 'break'
        break #跳出循环
    fi

  #加入判断
  if [ ${i} -ge 6 ]
  then
      echo 'continue'  
      continue #跳过本次循环执行下一次。
    fi
done

#循环的另外一种写法
for (( i=1;i<=2;i++ ))
do
    echo "for2 ${i}"
done

#while循环。
index=0
while(($index <=3))
do
    echo "while ${index}"
let "index++"
done

执行结果:

a 等于 b
for1 The value is:1
for1 The value is:6
continue
for1 The value is:7
break
for2 1
for2 2
while 0
while 1
while 2
while 3

无限循环:

while true
do
#执行业务
done

while  :
do
#执行业务
done
变量引用

引用shell变量要用$符号,并加{},以防止歧义。
例如:


Shell从入门到放弃_第1张图片
引用案例
声明变量

声明变量时,不能有空格,必须要有默认值。


案例
单引号和双引号

二者都可以标识字符串,不同的是,单引号只能表示字符串,而双引号可以引用变量或特殊函数。


Shell从入门到放弃_第2张图片
例子
命令代换

反引号`` 或者 $(),其中的内容,会以命令的方式执行。

[root@jcsrv-110 home]# echo `sldf`
bash: sldf: command not found
Shell从入门到放弃_第3张图片
例子
算数代换:$(())
[root@jcsrv-110 home]# SB=$((2+1))
[root@jcsrv-110 home]# echo ${SB}
3
[root@jcsrv-110 home]# 
数组
ar=(a 1 3 b 4 s) #定义数组
i=1 #变量
ar[${i}]=abc # 重新赋值
echo "数下标${i}的值为:${ar[i]}" # 输出
文件测试运算符
file="/home/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi

文件测试运算符用于检测 Unix 文件的各种属性。属性检测描述如下 :

操作符 说明 举例
-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。
函数定义:
[root@jcsrv-110 home]# vi funtest.sh 
#!/bin/bash

funAddNum(){  #定义函数
    echo "该函数对输入的两个数字进行相加运算...."
    printf "请输入第一个数字:"
    read anum  #控制台输入
    echo "请输入第二个数字:"
    read bnum  #控制台输入
    echo "两个数字分别为 ${anum} 和 ${bnum}"
    return $(($anum + $bnum))
}

funAddNum # 调用函数
echo "输入的两个数字之和为: $? " # $?获取函数返回。

输入结果:

[root@jcsrv-110 home]# ./funtest.sh 
该函数对输入的两个数字进行相加运算....
请输入第一个数字:1
请输入第二个数字:
3
两个数字分别为 1 和 3
输入的两个数字之和为: 4 
带参函数:
[root@jcsrv-110 home]# vi funParam.sh 
#!/bin/bash

funByParam(){
    echo "第一个参数: $1"
    echo "第二个参数: $2"
    echo "第五个参数: ${5}"
    echo "参数总数为: $# 个"
    echo "输入所有参数: $* "
}
funByParam 1 4 3 4 25 656 44  #传参调用.

输出结果:

[root@jcsrv-110 home]# ./funParam.sh 
第一个参数: 1
第二个参数: 4
第五个参数: 25
参数总数为: 7 个
输入所有参数: 1 4 3 4 25 656 44

你可能感兴趣的:(Shell从入门到放弃)